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

回答編集履歴

3

誤字修正(行松→行末)

2020/11/01 09:49

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -75,7 +75,7 @@
75
75
 
76
76
  printf( "buf(before)=(%s)\n", buf );
77
77
 
78
- /* 行の改行文字をカンマに置き換える */
78
+ /* 行の改行文字をカンマに置き換える */
79
79
  buf[ strlen( buf ) - 1 ] = ',';
80
80
 
81
81
  printf( "buf(after)=(%s)\n", buf );

2

コメントを受けて、具体的なコードを追記した

2020/11/01 09:49

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -43,4 +43,85 @@
43
43
  loop end
44
44
  buf=(D
45
45
  )
46
+ ```
47
+
48
+ #コメントを受けて追記
49
+
50
+ sampleという文字列配列に格納する処理の一例を書いてみました。
51
+ printf()で途中経過を表示するようにしてみたので確認してみてください。
52
+
53
+ ```C
54
+ #include <stdio.h>
55
+ #include <errno.h>
56
+ #include <string.h>
57
+
58
+ int main(void)
59
+ {
60
+
61
+ FILE *fp;
62
+ char buf[50]; /* 制限: 入力ファイルの1行の長さは49文字以外でなければならない */
63
+ char sample[1024]; /* 制限: 最終的な結果文字列のサイズは1023文字に収まらなければならない */
64
+
65
+ fp = fopen("sample.txt","r");
66
+ if ( fp == NULL ) {
67
+ perror( "fopen" );
68
+ return 1;
69
+ }
70
+
71
+ /* sampleを文字列長が0の文字列となるように初期化する */
72
+ sample[0] = '\0';
73
+
74
+ while(fgets(buf,sizeof(buf),fp) != NULL){
75
+
76
+ printf( "buf(before)=(%s)\n", buf );
77
+
78
+ /* 行松の改行文字をカンマに置き換える */
79
+ buf[ strlen( buf ) - 1 ] = ',';
80
+
81
+ printf( "buf(after)=(%s)\n", buf );
82
+
83
+ /* sampleの末尾に現在のbufを連結する */
84
+ strcat( sample, buf );
85
+
86
+ printf( "sample=(%s)\n", sample );
87
+
88
+ printf( "\n" );
89
+ }
90
+
91
+ fclose(fp);
92
+
93
+ /* sampleの末尾にあるカンマを削除する */
94
+ sample[ strlen( sample ) - 1 ] = '\0';
95
+
96
+ printf( "loop end\n" );
97
+ printf( "sample=(%s)\n", sample );
98
+
99
+ return 0;
100
+ }
101
+ ```
102
+
103
+ ```terminal
104
+ $ ./hoge
105
+ buf(before)=(A
106
+ )
107
+ buf(after)=(A,)
108
+ sample=(A,)
109
+
110
+ buf(before)=(B
111
+ )
112
+ buf(after)=(B,)
113
+ sample=(A,B,)
114
+
115
+ buf(before)=(C
116
+ )
117
+ buf(after)=(C,)
118
+ sample=(A,B,C,)
119
+
120
+ buf(before)=(D
121
+ )
122
+ buf(after)=(D,)
123
+ sample=(A,B,C,D,)
124
+
125
+ loop end
126
+ sample=(A,B,C,D)
46
127
  ```

1

表現ちょっと修正。

2020/11/01 09:42

投稿

hidezzz
hidezzz

スコア1248

answer CHANGED
@@ -1,6 +1,6 @@
1
1
  配列bufは質問で書かれている意図通りの結果にはなりません。
2
2
 
3
- 配列bufの中身はfgetを呼ぶたびに上書きされるので、「A,B,C,D」のような文字列を得たいのだとしたら別の文字配列コピーしていくような処理が必要だと思います。
3
+ 配列bufの中身はfgetを呼ぶたびに上書きされるので、「A,B,C,D」のような文字列を得たいのだとしたらbufに読みこんだ後に別の文字配列コピーしていくような処理が必要だと思います。
4
4
 
5
5
 
6
6
  ソースコードにprintf()を入れてあげれば手っ取り早く確認できると思います。