ファイルの中の行数をカウントするにはどうすればよいか
プログラムの行数ならその行数分だけ
またコメントや空白行もカウントするにはどうしたらよいか
以下のプログラムに追加したい場合どうしたらよいか教えてください。

#include <stdio.h>

int main(int argc , char *argv[]){

char s[256];
int i;
FILE *fin;
int local;
int nCount = 0;

for(i = 1 ; i < argc ; i++){

printf("%s\n",argv[i]);
local = 0;

fin=fopen(argv[i],"r");

memset(s,0,sizeof s);
while(fgets(s,sizeof s,fin) != NULL){
//printf("%s",s);
local++;
nCount++;
}
memset(s,0,sizeof s);
while(fgets)
printf("local count = %d\n",local);

fclose(fin);

}
printf("grobal count = %d\n",nCount);
return 0;
}

A 回答 (1件)

だいたいあってるようですが…。



[単純な行数カウントについて]
・fopen()でエラーが起こった時の対応が無い
・fgets()は'\0'を付加するためmemset()は不要
・fgets()が“1行を読みこむ”ことを期待してはいけない
fgets()は「第3引数で示した文字数-1」を超える文字数の行については分割して読みこまれるため、行は'\n'の有無で判断するべき('\n'無しでEOFの時は当然1行)
・2つ目のmemset()とwhile(fgets)は意味不明(というかwhile(fgets)は終了しないのでは?)

[空行、コメント行について]
仕様が不備で答えられません
・空白行とは何をさすか('\n'のみの行で良いか)
・コメント行とは何を指すか(C/C++のコメントで良いか)
・非コメントとコメントが1行にある場合はどちらにカウントするか(a++ ;/* インクリメント */などの場合)
・文字列定数中に改行が含まれる場合は行と認識するか
"a

b
c"
この場合、空行と改行が含まれる

仕様としてはこの程度は明確になっていないとプログラムは作れません。
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q英語と日本語を分けて文字カウントしたい

英語・日本語混合のテキストデータ(元はWORD)のうち、日本語部分だけ文字数をカウントしたいと思っています。

そこで、秀丸に載せた上でタブ・スペース・改行をすべて取り除き、シェアウエア等でソートをかけ、WORDに戻して文字カウントを行うことを思いつきました。

Easysort (http://www.vector.co.jp/soft/win95/util/se057281.html)等を試しているのですが、WORDに戻すところがうまくいきません(ソート前のデータがWORDに載ってしまいます)

どんな方法でも構いませんので、英語と日本語を分けて文字カウントする方法はないでしょうか?

Aベストアンサー

Wordの文字カウントに、
「文字数(スペースを含めない)」と「全角文字+半角カタカナの数」というのがありますので、もし、
・日本語:全角文字(全角英数字、全角記号を含む)+半角カタカナ
・英語:半角英数字、半角記号
・スペースはどちらにも含めない
と定義してよければ、
「日本語の数」=「全角文字+半角カタカナの数」
「英語の数」=「文字数(スペースを含めない)」-「全角文字+半角カタカナの数」
になると思いますが・・・。もし上記の定義で不都合があれば補足ください。

Qint main(int argc, char* argv[]) についての質問

こんにちは.つね日ごろ思っている質問させてください.
Cの参考書には,
(1)
void main(void)
{
}

(2)
int main(int argc, char* argv[])
{
return 0;
}
の2つのパターンが記載されていますが,
どういう違いがあるのでしょうか?

(1)の場合main関数は,型を持たず,引数も持たない.
※Turbo Cなどのコンパイラーでは,
return文がないと警告出ます.
(2)の場合は,int 型をかえし,引数はint型 変数と char型ポインタ配列(?)
を指定している.
といったくらいしか分かりません.

(2)に関してもう少し述べれば,
コマンドラインからファイルを指定し,実行することが
できると勉強した記憶があるのですが,
理解があいまいです.

特に(2)の場合のmain関数の意味と,その使い方について
アドバイスお願い致します.

Aベストアンサー

> (1)
> void main(void)
  ...
> (2)
> int main(int argc, char* argv[])
  ...
> の2つのパターンが記載されていますが,どういう違いがあるのでしょうか?

(1) は、間違いです。少なくとも ANSI-C の規格に合致していません。

main() は、特別な関数で、ANSI-C の規格では以下の三通りのうちのどれか
でなくてはいけない、と定められています。

int main(void)
int main(int argc, char *argv[]);
int main(int argc, char *argv[], char *envp[]);

因みに三番目の形式では、三つ目の引数には環境変数が入ります。
以下のようなコードで確認ができます。

int main(int argc, char *argv[], char *envp[])
{
  int i = 0;
  while (envp[i]) {
    printf("envp[%d] = '%s'\n", i, envp[i]);
    ++i;
  }
  return 0;
}


> ※Turbo Cなどのコンパイラーでは,return文がないと警告出ます

Turbo C は、規格に厳格なのでしょう。返り値が void なのはおかしいので、
int だとみなすよ、という警告も出てるはず。で、int が帰り値だとみなし
ているので return が無いと、返り値が不定になるよ、と警告を出している
のでしょう。

> (1)
> void main(void)
  ...
> (2)
> int main(int argc, char* argv[])
  ...
> の2つのパターンが記載されていますが,どういう違いがあるのでしょうか?

(1) は、間違いです。少なくとも ANSI-C の規格に合致していません。

main() は、特別な関数で、ANSI-C の規格では以下の三通りのうちのどれか
でなくてはいけない、と定められています。

int main(void)
int main(int argc, char *argv[]);
int main(int argc, char *argv[], char *envp[]);

因みに三番目の形式では、三...続きを読む

QExcel 2003 の度数関数は日本語をカウントしないのですか?

Excel 2003 の度数(frequency) 関数を試しています(初心者です)。
数字をカウントするのには実際にやってみて成功しました。しかし日本語の文字列をカウントさせたいのですができませんでした。

好き、きらい、どちらともいえない、の3つの選択肢をAの列に羅列させました(A1 から A40に)。

Aベストアンサー

文字列の場合は、COUNTIF関数を使った方がいいと思います。

B           C
好き          =COUNTIF(A:A,B1)
きらい         (下へコピー)
どちらともいえない

Qmain(int argc,char **argv[])の意味を教えて下さい

 今晩は、Cの初心者です宜しくお願いします。
 main関数の引数で、int main(int argc,char **argv[])とint main(int argc,char *argv[])と書かれている場合がありますが、
「**argv」と「*argv」の意味の違いはどのようなもので、どのように使い分けるのでしょうか。
また、必ずポインタ型でとるという決まりでしょうか。
宜しくお願いします。

Aベストアンサー

これは質問者さん向けというより、半分他の回答者さんに向けたコメントですが、

おそらく質問者さんの本当の意図は、ポインタと配列の違いではなく、
main関数の引数宣言の仕方に2パターンあるが、これはどう使い分けるのか、
というところにあるのではないでしょうか。
私はそう考えて回答3を書きました。

ところが、質問者さんが**argv を **argv[]と書き間違えちゃったために、
質問を深読みしちゃって
C言語におけるポインタとは何か、というかなり難易度の高い議題で
回答がいっぱい集まっちゃったと。

で、ちょっとだけ質問者さんを弁護。

質問者さんは回答1のお礼欄に

> int main(int argc,char **argv) でした、すみません、どのような意味でしょうか。

と書かれています。

わたしが回答3を書こうとした時点で、すでにこのコメントがあったため、
私は回答3で関数の引数宣言における **argv と *argv[] の違いについて回答しています。

質問者さんは、こういう訂正は、こういうのはお礼ではなく補足コメントにすべきだったと思いますが、

回答された方々も、回答される前に、既に付けられた回答と、そこへの
質問者者さんのコメントなどをちゃんと読んでから回答していれば、
ここまでムダな回答が続くことが無かったんではないかと思います。

これは質問者さん向けというより、半分他の回答者さんに向けたコメントですが、

おそらく質問者さんの本当の意図は、ポインタと配列の違いではなく、
main関数の引数宣言の仕方に2パターンあるが、これはどう使い分けるのか、
というところにあるのではないでしょうか。
私はそう考えて回答3を書きました。

ところが、質問者さんが**argv を **argv[]と書き間違えちゃったために、
質問を深読みしちゃって
C言語におけるポインタとは何か、というかなり難易度の高い議題で
回答がいっぱい集まっちゃっ...続きを読む

Qファイナル・カウントダウン(洋画 )日本語吹き替え

youtubeをたまたま、見ていたらなつかしい映画をやっていてタイトルをみたら「ファイナル・カウントダウン」って表示されていました。日本語吹き替え版。
その動画サイトも、少しの場面しかなかったので、本編が見たくなりました。

内容は、カーク・ダグラス主演、マーチン・シーン。空母ニミッツが、日本が真珠湾攻撃をする数日前にタイムスリップして・・・。日本の大艦隊を発見して、結局、空母の持っている近代兵器(トム・キャットなど)で攻撃をするかどうかというものだったと思います。

色々と探しました。アマゾン(DVD)(VHS)から楽天市場、古本市場やブックオフ、オークション、セブンイレブンネットなど、検索でフリー検索をやってみましたがなかったです。
そもそも、再販となっているDVD自体に吹き替えがありませんし、VHSビデオにもないみたいです。
もう、この洋画の日本語吹き替え版はないのでしょうか。回答をよろしくお願いします。

Aベストアンサー

初回封切りの年代を考えると、出ているとしたらVHS。つまり、ビデオテープという形でしかないと思います。
DVDへの再収録の場合、日本語吹き替えはスポンサーの許可をとったりと大変で、声優さんを選ぶお金もかかるし、まず、DVD系では日本語吹き替えは無いと思います。
あっても日本語字幕がいいところだと思います。

たとえば、映像を修正して未放映を追加。
とかの、完全ノーカット版とか、映像再処理、リアルマスター版とかが追加で販売されれば、日本語吹き替えとして復活もあり得ると思います。

ちなみにこの作品って、日本映画の「戦国自衛隊」を元ネタにした、いわばアメリカ版戦国自衛隊。
みたいな作品として、当時話題になった作品です。
懐かしいですね。

Qint i,j; \n i=0,j=5;

int i,j;
i=0;
j=5:
と書いてあるソースは普通ですが、
int i,j;
i=0,j=5:
と書いてあるソースもあります。
後者はC++の正しい書式ですか?

カンマ演算子というのは後者のカンマのことですか?

Aベストアンサー

 正しい書式です。

i=0,j=5;
 における、「,」をカンマ演算子といいます。2項の演算子です。カンマで区切られた演算を「左から順番に」実行し、最後の演算を結果として返します。
 したがって、例の文であれば、i=0を実行し、次にj=5を実行。そして、j=5の結果の5を結果として返します。
 ・・・
 が、本来的には、あまり、例のような使い方はしませんね。よく見られるのは、次のような場合です。

 for (i=0,j=0 ; i < 50 ; ++i,++j) {

 のような形でよく見られます。for文の各式は、一つの式でなければならないので、こんな書き方をするわけです。初期化と更新部が一つにまとまり、ループが読みやすくなるのが利点かな。

Q英語と日本語の文章でそれぞれの文字数をカウント

英語と日本語が混ざった文章があるのですが、英語と日本語の文字数がどれだけあるのか、また、その比率をphpで調べたいと思っています。

例えば、「これは日本語Englishだ」という文章の場合、「英語は7文字、日本語は7文字。その比率は1:1」というように結果を出したいのですが、どのような方法がありますか?

よろしくお願い致します。

Aベストアンサー

ああ、以下の箇所

// 比率の書き出し
if($jcnt > $ecnt){
echo round($jcnt / $ecnt)." : 1";
} else if($cnt != $ecnt){
echo "1 : ".round($ecnt / $jcnt);
} else{echo "- : -";}



// 比率の書き出し
if($jcnt > $ecnt){
echo round($jcnt / $ecnt)." : 1";
} else if($jcnt != 0 && $ecnt != 0){
echo "1 : ".round($ecnt / $jcnt);
} else{echo "- : -";}

の間違いです。

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。

Q日本語の素晴らしさとは何か

 
英語と比べて日本語の素晴らしいところは何ですか。
また日本語の良くないところはありますか。

話し言葉としての日本語、書き言葉としての日本語、文法からみた日本語、文芸からみた日本語、コミュニケーション能力としての日本語、情報伝達手段としての日本語、その他あれこれとしての日本語についてお聞かせ下さい。
 

Aベストアンサー

 「日本語」といっても仮名文字もあれば漢字もあり、更にはローマ字もありますよね。だから一概に「ビジュアル系やオーディオ系」と簡単に分類もできない話ですよ。
 その漢字ですらも漢音もあれば呉音や唐音もあります。そしてこの漢字が日本に入ってきた当初の原則は「人の音に対して一文字を充てて表記する」とのルールの下で「文字記述」が行われてもいました。これを万葉仮名と呼び、文字の意味などはさほどに重視もしていなかった。その背景ですが、日本には「文字がなかった」ことが最大の理由です。
 その後、統治組織および法に基づく政治システムを確立するためにはどうしても「文書記録」が必要となり、文書様式を含めての「言語としての日本語」が本格的に形成され始めもします。
 そして中世から近世にかけて、質問者様が挙げられた「日本語的特性」に変化が現れ始めます。「南蛮文化」はそれまでとは全く異なる性質を有しその文化との邂逅がそれにあたります。
 ポルトガルの商人や宣教師達は「自身が耳で聴いた日本語」をそのままローマ字表記で記し、そこに母国語での訳語を載せた辞書を作ります。『日葡辞書』と呼ばれ、合理的な作りになっていることで知られてもいます。この文献を調べれば、その当時に「日本人がどの様に発音していたか」も知ることができます。
 他にも「同じ音でありながら、異なる文字を宛てる性質の仮名文字」もあります。たとえば「い→ゐ」「え→ゑ」です。そして「ゑ」も場合によって「酔う」や「要う」との漢字を充てられている場合もみられます。
 そして日本語と英語に共通する部分もあって「外来語の受容に寛容である」との部分です。英語のmoustacheの語源はフランス語に由来するとも言われ、日本語のカルタはポルトガル語のCartaに語源を発するとも言われています。
 そして「日本語を表記する」仮名文字も漢字は見かけで難しく見えますが筆順からみれば合理的かつバランス良く書く事ができるともいえるでしょうね。
 難点があるとすれば「方言」の問題で、話し言葉だけで理解しようとしても困難を窮める場合も多々あり、外国語を学ぶよりも苦労することも珍しくはありません。

 「日本語」といっても仮名文字もあれば漢字もあり、更にはローマ字もありますよね。だから一概に「ビジュアル系やオーディオ系」と簡単に分類もできない話ですよ。
 その漢字ですらも漢音もあれば呉音や唐音もあります。そしてこの漢字が日本に入ってきた当初の原則は「人の音に対して一文字を充てて表記する」とのルールの下で「文字記述」が行われてもいました。これを万葉仮名と呼び、文字の意味などはさほどに重視もしていなかった。その背景ですが、日本には「文字がなかった」ことが最大の理由です。
 ...続きを読む

Qmain関数のとる引数(argc , *argv[])の意味について

 今日は、Cの初心者です宜しくお願いします。
 
 main関数(main(int argc , *argv[]))のとる引数、argcのCと*argv[]のVはどのような意味の略なのでしょうか、
なにか意味があるようなきがするのですが。
 宜しくお願いします。

Aベストアンサー

文字列の個数(argument count)

"ARGument Vector" の略という説と、"ARGument Value" の略という説がある。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報