回答編集履歴

2

ポインタ版改良(?)

2020/04/14 19:35

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -52,8 +52,6 @@
52
52
 
53
53
  #include <stdio.h>
54
54
 
55
- #include <string.h>
56
-
57
55
 
58
56
 
59
57
  int main(void) {
@@ -78,11 +76,11 @@
78
76
 
79
77
  for(int i=0; i<n; i++) {
80
78
 
81
- if(i > 0) { *p++='_'; *p='\0'; } //2つめ以降の前に "_" を付ける
79
+ if(i > 0) *p++ = '_'; //2つめ以降の前に "_" を付ける
82
80
 
83
81
  fgets(p, endp-p, stdin);
84
82
 
85
- p += strlen(p) - 1; //-1 は改行
83
+ while(*p != '\n') p++; //改行まで移動
86
84
 
87
85
  *p = '\0'; //改行を消す
88
86
 

1

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

2020/04/14 19:35

投稿

jimbe
jimbe

スコア12648

test CHANGED
@@ -1,4 +1,4 @@
1
- ポインタを扱えれば, str 内で直接編集していくようにも出来ます.
1
+ ~~ポインタを扱えれば,~~ str 内で直接編集していくようにも出来ます.
2
2
 
3
3
  ```c
4
4
 
@@ -43,3 +43,57 @@
43
43
  }
44
44
 
45
45
  ```
46
+
47
+ すいません, 正確には上のコードは配列でした.
48
+
49
+ ポインタだと以下の感じですね.
50
+
51
+ ```c
52
+
53
+ #include <stdio.h>
54
+
55
+ #include <string.h>
56
+
57
+
58
+
59
+ int main(void) {
60
+
61
+ char str[1000];
62
+
63
+ int n;
64
+
65
+
66
+
67
+ fgets(str, sizeof(str), stdin);
68
+
69
+ sscanf(str, "%d", &n);
70
+
71
+
72
+
73
+ char *p = str;
74
+
75
+ char *endp = str + sizeof(str);
76
+
77
+ *p = '\0'; // str を空にする
78
+
79
+ for(int i=0; i<n; i++) {
80
+
81
+ if(i > 0) { *p++='_'; *p='\0'; } //2つめ以降の前に "_" を付ける
82
+
83
+ fgets(p, endp-p, stdin);
84
+
85
+ p += strlen(p) - 1; //-1 は改行分
86
+
87
+ *p = '\0'; //改行を消す
88
+
89
+ }
90
+
91
+
92
+
93
+ printf(str);
94
+
95
+ return 0;
96
+
97
+ }
98
+
99
+ ```