こんにちは,エラーのある世界(0)のhello.cについて,5行目,「hello, world」のあとは「¥n」,そして文字列*1の終わりとなる「"」を書いていました.「n」の文字を取り除いて,hello2.cという名前で保存します.このファイルをコンパイルすると,エラーになります.
コマンドは:
$ cat hello2.c #include <stdio.h> int main(void) { printf("hello, world\"); return 0; } $ cc hello2.c hello2.c: In function ‘main’: hello2.c:5:10: warning: missing terminating " character printf("hello, world\"); ^ hello2.c:5:10: error: missing terminating " character printf("hello, world\"); ^~~~~~~~~~~~~~~~~ hello2.c:7:3: error: expected expression before ‘return’ return 0; ^~~~~~ hello2.c:8:1: error: expected ‘;’ before ‘}’ token } ^
実行環境1では:
実行環境2では:
エラー箇所は「hello2.c:5:10: error: missing terminating " character」です.日本語にすると,「hello2.cの5行目・10文字目で,エラー.文字列の終端となる"がありません」といったところでしょうか.hello2.cの5行目・10文字目は,「printf(」の直後の「"」(引用符)なのですが,これに対応する,閉じる引用符がないというエラーです.
同じ行の「);」の左に,「"」があるじゃないか,と言いたいところですが…
さらに左に「¥」の文字があり,これがくっついて「¥"」は,Cのプログラムにおいては「"」1文字を表します.エスケープシーケンスの一つであり,https://webkaru.net/clang/escape-sequence/で整理されています.文字列の終端の意味を失ってしまいまして,コンパイラがその後の行や文字を見ていっても,「"」がない,ということでエラーを報告したのでした.
メッセージをさらに見ていくと,「hello2.c:7:3: error(略)」というのと「hello2.c:8:1: error(略)」というのもありますが,これらには対処する必要がありません.最初に削除したnの文字を元に戻して,5行目を「printf("hello, world¥n");」に書き換えてから(保存も忘れずに!),コンパイルし直せば,エラーが出なくなります.Cにおいてエラーが多数発生した場合は,上の行から対処していくことで,効率よくデバッグができます.