
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
charと%c , %s の関係について
-
CStringのFindで文字列検索を行...
-
C++
-
教えていただけませんか?C言語...
-
2進数から10進数へ変換プログラム
-
Cで「大文字、小文字の判定」は...
-
「Aに対するBの割合」と「Aに対...
-
Enterキーを押されたら次の処理...
-
Aの値からBの値を除するとは??
-
有効数字について 以前質問をし...
-
信頼区間の1.96や1.65ってどこ...
-
std::set<int> で、ある値が何...
-
20'(角度)の計算がわかりま...
-
数学で、定数aの値を求めよって...
-
do-while文が禁止される理由
-
正の数aは4の倍数で、7でわると...
-
3桁区切(コンマ)記号をつけ...
-
プログラムでの数字につく”f”の...
-
未解決の外部シンボル _printf...
-
ループを途中で抜けたいのですが。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
fgets関数を使用したときの文字...
-
sscanfとscanfの違いがよくわか...
-
fgetsで拾われる改行文字を削除...
-
CStringのFindで文字列検索を行...
-
charと%c , %s の関係について
-
C言語のステップ数をカウントす...
-
反転した数値を表示させるやり方
-
C言語 空白の行(改行のみ)が...
-
Cで「大文字、小文字の判定」は...
-
putsとputcharの違い?
-
1行の文字列を時間差で表示する...
-
C言語 strlen 再入力を促す
-
str[j++]の意味
-
C言語の初心者です。これを実行...
-
C言語、単語ごとに改行したい
-
C言語:配列の中の文字を。。。
-
gets fgetsについて
-
プログラムのことで
-
文字列の操作
-
エディットボックスに入力され...
おすすめ情報