ID非公開

2021/4/10 23:10

44回答

C言語についての質問です。for文とif文の勉強として、プログラムを作成しようとしているのですが、詰みました。

補足

>「どのようになる」を書きましょう 例えば「abcd1efgh2ijkl3」と入力してEnterキーを押したら(nを入力したら)「Number is not contained.」と出力されます。 これは文字列に数字が含まれていない時に出そうとしていたメッセージです。本来であればここで「123」と出力させたかったのですが。 コンパイラはgccでバージョンは9.2.0です。 使用しているPCはWindows10で、オペレーティングシステムは64ビットです。

ベストアンサー

2

2人がナイス!しています

ID非公開

質問者2021/4/11 12:25

ご回答ありがとうございます。 デバッグとして、27行目にprintf("%d\n",k);と書いてみたら、入力した文字列に関わらず1になっていたのでおかしいと思い、13行目でprintf("%s\n",chr1)と入力したら、そもそも入力した文字列を出力していなかったので、あみやさんの仰る通りscanfの時点で修正が必要でした。 %15[]を%15[^]にして読み込めるようにしたところ、しっかり読み取ってくれて、意図した通りの出力をしてくれました。

ThanksImg質問者からのお礼コメント

皆さまご回答ありがとうございました。

お礼日時:4/11 12:27

その他の回答(3件)

2

色々おかしいのと、変数名が読みにくい気がします。 #include <ctype.h> #include <stdio.h> #include <string.h> int main(void) { char input[16]; // 15文字まで puts("write 15 letters."); scanf("%15[^]", input); // &は書いてはいけない // 15文字と分かっていても、一応長さをとっておきましょう const size_t input_len = strlen(input); char output[16]; size_t output_len = 0; for (size_t i = 0; i < input_len; ++i) {     const char in_c = input[i];     // 文字コードで書くより、isdigit の方が読みやすい     if (isdigit(in_c)) {         output[output_len] = in_c;         ++output_len;     } } // 文字列の末尾には null 文字 output[output_len] = '\0'; if (output_len == 0) {     puts("Number is not contained."); } else {     // chr3 に移し替える作業は不要     puts(output); } }

2人がナイス!しています

ID非公開

質問者2021/4/11 12:27

ご回答ありがとうございます。 変数の名前をもう少し工夫すべきでした。しかもまた、scanfで文字列に&をつけてしまうとは。 isdigit関数はいいですね。参考書で勉強していましたが、今まで読んだページではisdigit関数は出ていなかったので知りませんでした。 ありがとうございます。

2

>以下のコードを入力しましたが、正しく機能しません。どこがおかしいのでしょうか? char chr1[15];//scanfで15文字入力したいのであればnull文字を含めた16要素が必要 scanf("%15[]%*s", &chr1);//文字列を1文字も読み取らない printf("%s\n", chr3);//文字列末尾にnull文字を書き込んでいないchr3を表示しようとしている ※printf("%s", str)とした場合、printfは配列strの要素数分表示するのではなく、null文字の手前まで表示します。配列内にnull文字が無い場合は配列を超えて表示しようとします。

2人がナイス!しています

ID非公開

質問者2021/4/11 12:21

ご回答ありがとうございます。 scanf("%15[]%*s", &chr1);は確かに一文字も読み取りませんね。[]内に何も書いてないですから。

1

「正しく機能しません」じゃないよ。 それは主観でしょ? 「どのようになってほしいか」(これは書いてある)と、「どのようになる」を書きましょう。 環境によって違うとか、質問者さんの勘違いとか、コードが反映されていないとか……いろんな可能性があります。 それを「上手くいかない」って言われてもね…… まずは第三者に伝わるように書きましょう。

1人がナイス!しています

ID非公開

質問者2021/4/11 12:19

お礼のコメントが遅れました。申し訳ございません。 確かにプログラムの結果とか環境を書いていませんでした。次に質問する機会があれば、もっと分かりやすく書きたいと思います。 ご回答ありがとうございます。