teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

ポインタ版改良(?)

2020/04/14 19:35

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -25,7 +25,6 @@
25
25
  ポインタだと以下の感じですね.
26
26
  ```c
27
27
  #include <stdio.h>
28
- #include <string.h>
29
28
 
30
29
  int main(void) {
31
30
  char str[1000];
@@ -38,9 +37,9 @@
38
37
  char *endp = str + sizeof(str);
39
38
  *p = '\0'; // str を空にする
40
39
  for(int i=0; i<n; i++) {
41
- if(i > 0) { *p++='_'; *p='\0'; } //2つめ以降の前に "_" を付ける
40
+ if(i > 0) *p++ = '_'; //2つめ以降の前に "_" を付ける
42
41
  fgets(p, endp-p, stdin);
43
- p += strlen(p) - 1; //-1 は改行
42
+ while(*p != '\n') p++; //改行まで移動
44
43
  *p = '\0'; //改行を消す
45
44
  }
46
45
 

1

説明修正, ポインタによるコードを追加

2020/04/14 19:35

投稿

jimbe
jimbe

スコア13355

answer CHANGED
@@ -1,4 +1,4 @@
1
- ポインタを扱えれば, str 内で直接編集していくようにも出来ます.
1
+ ~~ポインタを扱えれば,~~ str 内で直接編集していくようにも出来ます.
2
2
  ```c
3
3
  #include <stdio.h>
4
4
  #include <string.h>
@@ -20,4 +20,31 @@
20
20
  printf(str);
21
21
  return 0;
22
22
  }
23
+ ```
24
+ すいません, 正確には上のコードは配列でした.
25
+ ポインタだと以下の感じですね.
26
+ ```c
27
+ #include <stdio.h>
28
+ #include <string.h>
29
+
30
+ int main(void) {
31
+ char str[1000];
32
+ int n;
33
+
34
+ fgets(str, sizeof(str), stdin);
35
+ sscanf(str, "%d", &n);
36
+
37
+ char *p = str;
38
+ char *endp = str + sizeof(str);
39
+ *p = '\0'; // str を空にする
40
+ for(int i=0; i<n; i++) {
41
+ if(i > 0) { *p++='_'; *p='\0'; } //2つめ以降の前に "_" を付ける
42
+ fgets(p, endp-p, stdin);
43
+ p += strlen(p) - 1; //-1 は改行分
44
+ *p = '\0'; //改行を消す
45
+ }
46
+
47
+ printf(str);
48
+ return 0;
49
+ }
23
50
  ```