プロが教える店舗&オフィスのセキュリティ対策術

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;
}

A 回答 (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);
がありますが、各行がどの行に属するのかを印字しています。
これが煩わしい場合は、コメントアウトしてください。
    • good
    • 1
この回答へのお礼

いつも丁寧にありがとうございます!完璧でびっくりしてしまいます。おかげさまでぶじかいけついたしました(っ´ω`c)

お礼日時:2016/10/06 12:05

C言語ソースを字句解析して、トークン単位で数えましょう。



行末記号もトークンとして認識させ、一行分のトークンを全て読み取ってから、
* 行内に、空白のトークンしかない → 「空白行」と勘定
* 行内に、空白とコメントのトークンだけある → 「コメント行」と勘定
* 行内に、その他のトークンがある → 「実行行」と勘定

あとは C 形式コメントで複数行有った場合の考慮を入れれば完成です。

参考) 字句解析ツールの一例
https://linuxjm.osdn.jp/html/flex/man1/flex.1.html
https://docs.oracle.com/javase/jp/8/docs/api/jav …
    • good
    • 1
この回答へのお礼

ありがとうございました!非常に参考になりました。助かりました。

お礼日時:2016/10/06 12:04

カウントのしかたがわからん. 例えば


int linecnt; //行数
のような行はどうカウントすればいいのかな?

あと, あなたのいう「全ステップ数」というのは「バイト数」のことでいいでしょうか?
    • good
    • 0
この回答へのお礼

おっしゃった行は、実行行としてカウントします。わかりづらくて申し訳ございません。
全ステップ数とは、空行、コメント行、実行行すべてを含めた総行数のことです。

お礼日時:2016/09/30 02:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!