ID非公開

2022/5/16 12:14

33回答

C言語でキーボード入力した文字列(MAX6文字)に含まれる文字cの数を表示(for文使用)

C言語関連 | プログラミング34閲覧xmlns="http://www.w3.org/2000/svg">100

ベストアンサー

0

その他の回答(2件)

0

~例~ #define _CRT_SECURE_NO_WARNINGS //Visual Studio 用 #include <stdio.h> int main() { char s[6 + 1]; if (scanf("%6s", s) == 1) { unsigned c = 0; for (unsigned i = 0;s[i];++i) { if (s[i] == 'c') ++c; } printf("cは%u文字\n", c); } } 《解説》 scanf の練習課題であると推測します。そうだとして、まずは以下のようにして「文字列(MAX6文字)」を受け取るための変数を用意します。 char s[6 + 1]; これは char s[7]; と書いても良いですが、そうしてしまうと仕様に示された「MAX6文字」との関係性が見えにくくなります。 「C言語でキーボード入力」については scanf("%s", s); こうすることもできるのですが、これだと問題があります。6 文字を超える入力があったときに予測不可能な事態となってしまうからです。C 言語のプログラミングの怖いところは、間違いが起きるとエラーになると決まっていなくて、もうどうなるかわからないという事態に陥ること。 ですので、次のようにするのが望ましいと言えます。 scanf("%6s", s); これで 6 個までの文字群を受け入れることが出来ます。(超えた分は s に取り込まれずに入力源に残留します。) また、scanf は失敗することがあります。文字列の受け取りで失敗することは稀ですが、しかしたとえば [Ctrl]+[Z]、あるいは [Ctrl]+[D] と打ち込むことによって EOF を与えると scanf は失敗します。そしてその場合、s に入力内容が取り込まれることはありません。 scanf の成否を見るためには if (scanf("%6s", s) == 1) { //成功したらここに到達 } else { //失敗したらここに到達 } このようにすると良いです。 入力の受け取りが終わったら、以下のようにして「文字cの数」を数えるための変数 c を用意し、 0 に初期化します。 unsigned c = 0; なお、unsigned は符号無し整数の意味です。「文字cの数」がマイナスになることは無いため unsigned としてみました。 文字列 s の中に「文字c」が何個あるのかを調べるために以下のように for 文を組みます。 for (unsigned i = 0;s[i];++i) { if (s[i] == 'c') ++c; } ここで、ループカウンタとして変数 i を導入しています。i は for 文の中だけで使用される変数であり、for 文が終わった後は存在しなくなります。また、このように変数 i を for 文内に封じ込めておくと、後で変数 c と 変数 i の取り違えが発生するのを防ぐ効果があります。(変数は狭い範囲に閉じ込めるよう入門段階から習慣付けることが大切であると考えます。) for 文が終わったら printf で結果を出力します。上記の例にある "%u" というのは unsigned 型に対応した書式指定であり、int 型の場合の "%d" に相当します。

0

(ID非公開) 例: #include<stdio.h> int main(void) { char s[10]; int i,cnt=0; printf("input >"); scanf("%s",s); for(i=0;s[i] != '\0';i++){ if(s[i]=='c')cnt++; } printf("cは%d文字\n",cnt); return 0; } ~~~~~~~~~~~~~~~~~ input >abcabc cは2文字