どんどんどん さんが書きました: ↑5年前
コード:
for (i = 0; str[i] != '\0'; i++) {
if (!in_com) { // 「/* で始まるコメント」の内部ではない
if (str[i] == '/') {
if (str[i+1] == '/') {
is_com = 1; break;
これは'\0まで一文字ずつ読み込んでいき、もし"/"がきてかつその次の文字が"/"なら1つカウントしてその処理を抜け出すということでいいんでしょうか?
is_com = 1; は、コメント行確定フラグを ON(TRUE) にしている
のです。これは、「ひとつカウントして」ではありません。
fgets で str に 1行読み込み、3つのフラグを全部 OFF(FALSE)
にしました。for (i = 0; str[ i] != '\0'; i++) { で
その 1行を先頭から末尾まで 1文字ずつ調べようとします。
「//」 があれば、コメント行確定ですから、フラグ is_com を
ON にして、break; で forループを抜け、フラグを見て、
そこでコメント行の行数をカウントアップします。
カウントして抜け出すのではありません。フラグをセットして、
ループを抜け出してから、行数をカウントアップするのです。
どんどんどん さんが書きました: ↑5年前
どの行で実行行に書かれているコメントをコメントではなく実行行として判断しているのでしょうか?
具体的な例で考えてみましょう。
str が " a = 1; // comment\n" だったとします。
先頭から 1文字ずつ見ていくと、str[1] が 'a' なので、
if (!in_com) { の中の else if (isgraph((unsigned char)str[ i]) {
で、実行行確定フラグ is_exe を ON にして、ループを抜け、
フラグを見て、そこで実行行の行数をカウントアップします。
str が " /* comment */ a = 1;\n" だったとします。
先頭から 1文字ずつ見ていくと、
str[1] が '/'、str[2] が '*' なので、
has_com = 1, in_com = 1 になり、
i++ で i を 2 にして forの i++ で i は 3 になり、
/* の次の文字を見に行きます。
str[12] が '*'、str[13] が '/' なので、
has_com = 1、in_com = 0 になり、
i++ で i を 13 にして forの i++ で i は 14 になり、
*/ の次の文字を見に行きます。
str[15] が 'a' なので、
if (!in_com) { の中の else if (isgraph((unsigned char)str[ i]) {
で、実行行確定フラグ is_exe を ON にして、ループを抜け、
フラグを見て、そこで実行行の行数をカウントアップします。
for, break, if-else で制御の流れがどうなるかが、わからないのですか?