質問: 0; i < COUNT_RANK; i++) { if(strlen(AccessRank[ i ].address)<=0) { break; } fprintf(fp,"%2d %6d \"%s\"\n",i+1,AccessRank[i].count,AccessRank[i].address); } if(fclose(fp)) { fprintf(strerr,"クローズに失敗しました。access_rank.txt\n"); exit(EXIT_FAILURE); } return 0; } ``` お伺いしたいのは、 1つ目。 strlen関数のところで、 <=0 と0以下になっているのが疑問です。 strlenで文字数を数えて、0ならば、それでデーターの終端だから、 break するのだと思うのですが、 文字数がマイナスになることはないので、=0で良いと思うのですが、なぜでしょうか。 文字が無いとEOFを返すのでしょうか、だから、-1を考慮にいれているのでしょうか。分かりません。 2つ目は、 fprintf(fp,"%2d %6d \"%s\"\n",・・・・ のところで、 \"%s\" これがどう意味か分かりません。 sは文字列の表示だからだと思いますが、 二つの[ \ ]バックスラッシュと、[ " ]ダブルクオーテーションが不明です。 最後に、 if(fclose(fp) これですが、クローズに失敗すると、EOFがfcloseの戻り値になるので、ifが実行されると解釈して良いのでしょうか。 よろしくお願いします。こんな素人の質問はこちらのサイトではふさわしくないように思い恐縮です。
回答: 一つ目 strlenは(標準ならば)仰る通り文字列長(つまり0以上の整数)です。なので「0以下であること」と「0であること」は同条件です。まあ=演算子は代入なので、==演算子で比較しないといけないですが。ちなみに、これよりも直接一文字目を見て終端文字であるかを判断したほうがいいです。strlenだと、文字列が長いとそれだけ時間がかかります。 二つ目 ダブルクオーテーションを表示したいので特殊な記号を使っています。これがないとダブルクオーテーションは文字列の先頭(終端)記号とみなされるためです。