
C言語のステップ数をカウントするプログラムについて教えてください。空白行・コメント行・実行行・そして全ステップ数をカウントします。全ステップ数については以下のように考えましたが空白行、コメント行をどのようにしたらよいかわかりません。ご指導宜しくお願いいたします。
※コメント行は// や/* */を対象にします
※空行はタブと改行のみの行も含みます
#include<stdio.h>
#include<stdlib.h>
int main()
{
int linecnt; //行数
int a;
FILE *fp;
fp = fopen("test.txt", "r");
if(fp == NULL){
printf("入力ファイルがオープン失敗\n");
exit(1);
}
linecnt = 1;
while(feof(fp) ==0){
a = fgetc(fp);
linecnt++;
}
printf("全ステップ数 = %d", linecnt);
return 0;
}

No.3ベストアンサー
- 回答日時:
下記のサイトにソースを投稿しましたので参照にしてください。
http://climbi.com/b/8059/0
今回の質問は、C言語のソース解析を行いますが、厳密に行おうとするとC言語のコンパイラ
が行っている構文解析と同等の処理が要求されます。
それなので、簡易版の形で書いてみました。(バグがあるかもしれませんの自己責任でご使用ください)
作成方針は以下の通り。
1.1行の長さは1024バイト以内が前提
2.コンパイルが正常に完了したソースであることが前提
3.コメントの扱いは以下の通り
/*から*/までをコメントとみなす。(複数行にまたがることを考慮する)
//以降をコメントとみなす。(1行のみで、複数行にまたがることはない)
4.空白行の扱いは以下の通り
行の先頭から終端迄、空白、タブのみで構成される行(空白、タブがなくても良い)
/* から */の間にある空白行は、コメント行として扱う
5.上記3,4以外の文字が出現した場合、実行文とみなす。
6.ダブルクオート(")ではさまれた文字列中に、/*、*/、//等があってもコメントとは扱わず
普通の文字列として扱う。
例
"aascii// abcd " はコメントではない
"/* abcd */" はコメントではない
7.ダブルクオート(")の終端は\で修飾されないダブルクオート(")とする。
例
"abc" 最後"がダブルクオート終端
"ab\"" 最後の"がダブルクオート終端
"ab\"a\"a" 最後の"がダブルクオート終端
"a\\" 最後の"がダブルクオート終端
8.シングルクオート(')で挟まれたダブルクオートは普通の文字として扱う。
例
'"' 普通のデータ(上記6,7の扱いをしない)
'\"' 同上
9.各行のカウントは以下の通り
コメントのみで構成させれる行をコメント行としてカウントする
空白行のみで構成させれる行を空白行としてカウントする
上記以外を実行行としてカウントする
尚、実際にソースステップをカウントするツールがあるので、それと比較してみました。
下記サイトのRakuStepCounterをダウンロードして実行した結果、こちらで作成した結果と同じ結果に
なりました。(多少のソースの比較のみです)
http://www.rakuchinn.jp/rakustepcounter.html
このソースをstep_count.cとして自分自身のソースをカウントすると以下のようになります。
総ステップ数=223
実行行数=184
コメント行数=37
空白行数=2
尚、136行に
printf("%d:%s\n",All_count,type);
がありますが、各行がどの行に属するのかを印字しています。
これが煩わしい場合は、コメントアウトしてください。
No.2
- 回答日時:
C言語ソースを字句解析して、トークン単位で数えましょう。
行末記号もトークンとして認識させ、一行分のトークンを全て読み取ってから、
* 行内に、空白のトークンしかない → 「空白行」と勘定
* 行内に、空白とコメントのトークンだけある → 「コメント行」と勘定
* 行内に、その他のトークンがある → 「実行行」と勘定
あとは C 形式コメントで複数行有った場合の考慮を入れれば完成です。
参考) 字句解析ツールの一例
https://linuxjm.osdn.jp/html/flex/man1/flex.1.html
https://docs.oracle.com/javase/jp/8/docs/api/jav …
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語階乗の総和を求める 2 2023/03/04 23:31
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# C言語 3 2022/10/04 15:07
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
charと%c , %s の関係について
-
sscanfとscanfの違いがよくわか...
-
fgetsで拾われる改行文字を削除...
-
文字列中に含まれる文字の個数...
-
反転した数値を表示させるやり方
-
C言語の問題 キーボードから1 ...
-
itoaわかりません
-
ブランクのチェック
-
C言語でパスワード作成ツール
-
C言語 空白の行(改行のみ)が...
-
自作の関数を見てください。
-
C言語のisdigit関数を使った問...
-
どうやっても上手くいきません…
-
C言語 strlen 再入力を促す
-
C++
-
初歩的なプログラムなんですが...
-
sscanfでフォーマットに合って...
-
C言語のステップ数をカウントす...
-
c言語について array[i]-‘0’ こ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
CStringのFindで文字列検索を行...
-
fgetsで拾われる改行文字を削除...
-
itoaわかりません
-
sscanfとscanfの違いがよくわか...
-
Cで「大文字、小文字の判定」は...
-
C言語のステップ数をカウントす...
-
fgets関数を使用したときの文字...
-
CStringについて
-
ブランクのチェック
-
単語数のカウントについて
-
C言語 空白の行(改行のみ)が...
-
C言語で可変長から固定長に変換...
-
文字列中に含まれる文字の個数...
-
反転した数値を表示させるやり方
-
fgetsとsscanfを使って一行から...
-
C++
-
メニューバーでクリックした個...
-
fgetsの用法について
-
文字列の途中に「0」がある場...
-
かぶった文字を消すプログラム
おすすめ情報