実現したいこと
fgets関数で受け取る末尾文字について理解する
前提
バッファリングについて学んでいるのですが、以下のfgets関数で標準入力を受け取って、バッファリングを行う際の処理内容がいまいち掴めず、困っています。
発生している問題・エラーメッセージ
「該当のソースコード」欄に、ソースコードの全文を載せさせて頂きました。
その中で、よくわからないのが、以下の部分です。
if (p != NULL) *p = '\0'; if(buf[0] == '\0') break; printf("%u: %s", line, buf); line ++;
例えば、下記のコードをコンパイル、実行、abcdefghijklmnという文字列を入力したとします。
そうすると、以下のような実行結果になりますよね。
abcdefghijklmn (<-- 入力した内容)
0: abcd1: efgh2: ijkl3: mn
bufは5つ配列の要素を受け取り、0~3のそれぞれ末尾文字として\0がつくため、4文字づつ出力され、処理が終わるところまでは理解できました。
ですが、4回目の処理について違和感があります。
mnが出力される場合、buf[]配列は以下のようになっている認識です。
m n \n \0
ここでstrcharが\nを見つけるので、それを\0に変更。なので、実際にprintfする際は、以下のようになっていると思います。
m n \0 \0
printfで出力する際は、\0時点で末尾文字が入っているため、m n \0 まで出力され、最後の\0はbuf[0]に格納され、後続のbreak処理に入るという理解でいいのでしょうか?
該当のソースコード
#include <stdio.h> #include <stdlib.h> #include <string.h> int main(void) { char buf[5]; unsigned int line = 0; for(;;) { if((fgets(buf, sizeof buf, stdin)) == NULL) { fputs("読み込み中にエラーが発生しました", stderr); exit(1); } /*末尾が\nの場合、\0に置き換える*/ char *p = strchr(buf, '\n'); if (p != NULL) *p = '\0'; if(buf[0] == '\0') break; printf("%u: %s", line, buf); line ++; } }
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。

回答3件
あなたの回答
tips
プレビュー