• ベストアンサー

文字数と単語数を数えるプログラム

When in Rome, do as the Romans do. をchar形配列に格納し、文字列に含まれる(空白以外の)文字数と単語数を数え、結果を画面に出力するプログラムがうまくできません。文字数と単語数の数え方がさっぱり… アドバイスしていただけると幸いです。よろしくお願いします

質問者が選んだベストアンサー

  • ベストアンサー
  • DT200
  • ベストアンサー率38% (63/164)
回答No.3

文字数も数えると云う事なので、左から右端(NULL文字)まで1文字ずつ 走査して行きます。ここで、単語も構成する文字がA-Z,a-zであるとして、 文字から空白や記号(','や'.'、NULL文字も含む)に変わったら一つの単語 とします。 具体的には、 1. カウンタ、フラグを初期化 2. NULL文字になるまで繰り返し 3. 文字かどうか判定する 4. 文字なら文字をカウントして、フラグをセット 5. 文字でないなら、 6. フラグがセットされていれば単語数をカウントしフラグをおろす 7. フラグがセットされていないのなら何もしない 8. 1へ でいけると思います。

hororo06
質問者

お礼

アドバイスありがとうございます。 とてもわかりやすく説明していたき、ありがとうございます。 これならなんとかなりそうです。 ありがとうございました。

その他の回答 (2)

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス >多分これを使わなくてもできるのだと思うのですが、なにかいい方法はありませんか?  ↑  それが分かるのなら自力で出来る気がしますが…。 ・いい方法とはアルゴリズムのことですか?  文字数は isalpha() 関数でチェックして英大文字、英小文字の場合にカウンタを  インクリメントすればよい。  単語数はアルファベット、空白文字の並びがいくつ登場するかをカウントすればよい。  空白文字は isspace() 関数でチェックできます。 ・両方とも文字検査関数と組み合わせるだけでカウントできます。  ctype.h ヘッダをインクルードすれば利用できるようになります。 ・以上。

参考URL:
http://always-pg.com/c/runtime_rd/character/isalpha.html
hororo06
質問者

お礼

アドバイスありがとうございます。なんか難しそうですが自分なりに調べて試してみます。ありがとうございました

  • volveive
  • ベストアンサー率38% (31/81)
回答No.1

strtok という関数について調べてみてください。

参考URL:
http://www1.cts.ne.jp/~clab/hsample/Func/Func08.html
hororo06
質問者

補足

アドバイスありがとうございます strtokですか…。見てみましたがこの関数はまだ習ってません。 多分これを使わなくてもできるのだと思うのですが、なにかいい方法はありませんか?

関連するQ&A

  • 「郷に入っては郷に従え」英語で他の言い方

    「郷に入っては郷に従え」を調べると「When in Rome, do as the Romans do.」が でてくるのですが。 TV番組の奥様は魔女で「郷に入っては郷に従え」と訳されているところが 「When in Rome, do as the Romans do.」とは何回聞いても聞こえないのです。 「イフ ユウ ケイ ビーダム ジョイダム」と聞こえるのですが、なんと言っているのか わかる方いますか? 「郷に入っては郷に従え」は「When in Rome, do as the Romans do.」以外に言い方が あるのですか?

  • 郷に入れば郷に従えは英語にすると・・・

    郷に入れば郷に従えは英語でwhen in rome do as the Romans.となっていますが、これを、when you are in rome do as the Romans do.とテストで書いたら滅点、減点対象になりますか。

  • 英文和訳です。

    ●When in Rome, talk to the Romans. That is my variation on the proverb. (by J. Rogers) これは、Do im Rome, as the Romans do. に例えたものだと思うのですが、うまい日本語訳は ありますか?

  • 単語逆順コピープログラム

    入力された文字列を逆から表示するというプログラムを作成しているのですがなかなかうまくいきません。僕の作成したプログラムを載せておくので間違いの指摘をお願いします。 出力例(一部) 入力文字列:[ pen. a is This ] 出力文字列:[This is a pen.] ---------コードここから--------- #include <stdio.h> #include <string.h> /* マクロの定義 */ #define BUF 1024 int main(void){ char in[BUF]; /* 入力された文字列を保存する */ char out[BUF]; /* input の内容を単語逆順にして保存する */ int wordcount = 0; /* 単語数 */ char *in_ptr, *out_ptr; /* それぞれの文字列の文字を指すポインタ */ int wsp[128], wep[128]; /* 単語の先頭の添え字と単語末の添え字を保存する配列 */ int i, j; printf("入力された英単語列を単語逆順にします\n"); printf("入力:"); fgets(in, sizeof(in), stdin); sscanf(in, "%c", &in); /* \nを\0に書き換える */ in_ptr = in + strlen(in) - 1; *in_ptr = '\0'; /* 単語数カウント */ printf("文字数のカウント開始\n"); in_ptr = in; if(*in_ptr != ' '){ wordcount++; } for(in_ptr = in; *in_ptr != '\0'; in_ptr++){ if(*in_ptr != ' ' && *(in_ptr - 1) == ' '){ wordcount++; } } printf("文字数のカウント終了: %d単語\n", wordcount); printf("\n単語逆順処理開始\n"); for(i = 0; i < wordcount; i++){ for(in_ptr = in; *in_ptr != '\0'; in_ptr++){ if(*in_ptr != ' ' && *(in_ptr - 1) == ' '){ wsp[i] = *in_ptr; } if((*in_ptr - 1) != ' ' && (*in_ptr == ' ' || *in_ptr == '\0')){ wep[i] = *in_ptr; } } } out_ptr = out; for(i = wordcount - 1; i <= 0; i--){ for(*in_ptr = wsp[i]; *in_ptr <= wep[i]; in_ptr++){ *out_ptr = *in_ptr; out_ptr++; } } printf("単語逆順処理終了\n"); printf("\n入力文字列:[%s]\n", in); printf("出力文字列:[%s]", out); return 0; } ---------コードここまで---------

  • 訳を教えてください!!

    次の英文の訳を教えてください。 The old saying "When in Rome in do as the Romans do"is never more true than when at the dinner table. 主語のことわざの意味はわかるのですが、それ以外がわかりません。 <than when>は関係代名詞かな?とは思うのですが、初めて見るのでわかりません。 よろしくお願いします。

  • 英語でどう表現しますか?

    カンボジアで在住外国人向けに洋服の販売を考えています。広告の宣伝文で「郷に入ったら郷に従え」を変えて「カンボジアではカンボジア人が着るように着なさい」という文を英語で作りたいのです。 When in Rome, do as the Romans do. を変えて When in Cambodia, wear as the Cambodian do. でいいのでしょうか? まず、When in Cambodia, でいいのか When you are in Cambodia,のほうがいいのか。そしてthe Cambodianなのかthe Cambodiansなのか。。。響き的には上記の文を使いたいのですが。 フランス人に上記の文章を見せたら意味がよくわからないと言われてしまいました。宜しくお願いします!

  • 文字型配列に格納した空白の切捨て

    Cでやり方がわからないことがあるのでご質問があります。 文字型配列、例えばchar buf[128]にfgetsなどで、文字列を格納したとします(例えば"abc defghi ")。 この場合、最後に続く空白がその後の作業で邪魔なので新しい文字型配列もしくはポインタに、2つ以上空白が続いた場合は、最後の文字までで、以下の空白は切り捨てた状態("abc defghi")で格納したいのですが方法が思い浮かばず困っています。 よい方法があればお教えください。 よろしくお願いします。

  • 配列への文字列の追加ってどうやって追加するの?

    配列に文字列をいれたいのですが char a[100]; sprintf(a,"AB"); と書くと a[0]にAが a[1]にBが a[2]に\0が格納されますよね。 「配列に一度格納された文字列に新たな文字列を追加」したいのです。 つまり この\0を上書きしてa[2]から CD を追加し、結果 a[0]にAが a[1]にBが a[2]にCが a[3]にDが a[4]に\0が 格納されているようにしたいのです。 半角英数だったらできるのですが全角だとどうやるのでしょうか。 やりたい事は以下のようなものです。 "あい"を1度目の処理で配列に文字列を格納し、次の処理で"うえ"を追加し、 配列aをprintfするとき「あいうえ」が出力されるようにしたいのです。 どなたか教えてください(>_<

  • セル内に複数の単語。一定文字数を超えた単語を検出

    一つのセル内の複数の単語は、半角空白で区切られていて、数は1~4つでバラついています。 セルの中の単語で、一定文字数を超え単語を含むセルを検出し、セルに色を付けたいのです。 そのセルは、縦一列に並んでいるので、列内で検索、検出したいのです。 このようなマクロを教えて下さい。 セル内の単語が一つであれば、他にも方法はあるみたいですが、複数なので困っています。 お願い致します。

  • 単語数のカウントについて

    C言語のプログラミングについて質問させていただきます。 『一行の入力に対し,入力された英文の文字数,単語数,文字の使用頻度を数える』という問題なんですが、一応プログラムを組むことはできました。 しかし、今のプログラムのままでは単語間にを連続して入力しても単語数が増加してしまいます。 そこで、単語間の空白が2文字以上でも安定して単語数を正しく数えることができるようにするためにはどのように変更すればいいのか教えてください。 よろしくお願いします。 #include <stdio.h> int main(void){ char line[100]; /* キーボード入力用汎用変数 */ int i; /* 繰り返し用カウンタ */ char temporary; /* テンポラリ */ int moji_acount[128]; /* 文字カウンタ */ int moji_count = 0; /* 文字数 */ int tango_count = 0; /* 単語数 */ /* 文字カウンタの初期化 */ for(i=32;i<128;i++){ moji_acount[i] = 0; } /* 文字列の入力 */ printf("文字列:"); fgets(line, sizeof(line), stdin); /* 繰り返し用カウンタの初期化 */ i = 0; /* 文字数を数える作業 */ while(line[i] != '\n'&& line[i] != '\0'){ moji_count++; i++; } /* 文字数の表示 */ printf("文字数:%d\n", moji_count); /* 文字をテンポラリに保存 + 文字カウンタを数える作業 */ for(i=0;i<moji_count;i++){ temporary = line[i]; moji_acount[(int)temporary]++; } /* 入力された文字と回数を表示 */ for(i=32;i<128;i++){ if(moji_acount[i] != 0){ /* 文字カウンタがゼロでないときに繰り返し */ printf("'%c': %2d個\n", (char)i, moji_acount[i]); } } /* 繰り返し用カウンタの初期化 */ i = 0; /* 単語数を数える作業 */ while(line[i] != '\n' && line[i] != '\0'){ if(line[i] == ' '){ /* もしline[i]がスペースのとき */ tango_count++; } i++; } printf("単語数:%d個\n", tango_count + 1); return 0; }

専門家に質問してみよう