質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

5回答

2600閲覧

「C言語」数字入力をチェックして結果を出すプログラム

kaylee423

総合スコア1

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/07/28 01:13

前提・実現したいこと

C言語初心者です。以下のような問題に取り組んでいます。
いつでも構いませんので、都合のいい時にお願いします。

【要求】
1から100までの整数二つを入力して、出力します。
ただし0または100以上、小数、文字列を入力した場合エラーメッセージがでる。

【現状】
コンパイルは通りましたが、
実行した際に期待通りの動作になりません。
以下のエラーメッセージが発生しました。

発生している問題・エラーメッセージ

1.両方とも正しく入力した場合
数値1=36
数値2=25
......
で入力が続いて、結果処理ができない。

2.
エラーが出るように入力した場合は以下のような結果がでます。
数値1=sdfsdfsd
数値2=エラーです、1から100までの整数を再入力してください

該当のソースコード

C言語
#include <stdio.h>

main()
{
int n1, n2;
float f;
char ss;

printf("数値1=");
scanf("%d",&n1);
printf("数値2=");
scanf("%d",&n2);
if(n1<1 || n1>100){
printf("エラーです、1から100までの整数を再入力してください");
}
else if(n2<1 || n2>100){
printf("エラーです、1から100までの整数を再入力してください");
}
else if(scanf("%f"),&f){
printf("エラーです、1から100までの整数を再入力してください");
}
else if(scanf("%s",&ss)){
printf("エラーです、1から100までの整数を再入力してください");
}
else{
printf("数値1は=%d\n",n1);
printf("数値2は=%d\n",n2);
}
}

試したこと

数値1を正しく入力して、数値2をエラーが出るように入力した場合は期待通りの動作になります。
数値1を100以上の整数を入力した場合、エラーメッセージが出さずに数値2の入力に進み、数値2の入力が終わったらエラーメッセージが出る。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

[要求] には「エラーメッセージがでる」とあるだけで、再入力は要求していません。
次のコードでよいのではありませんか?

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int n1, n2; 6 7 printf("数値1="); 8 if (scanf("%d", &n1) != 1 || n1 < 1 || n1 > 100) { 9 puts("エラーです、1から100までの整数が入力されませんでした。"); 10 return 1; 11 } 12 printf("数値2="); 13 if (scanf("%d", &n2) != 1 || n2 < 1 || n2 > 100) { 14 puts("エラーです、1から100までの整数が入力されませんでした。"); 15 return 1; 16 } 17 printf("数値1は=%d\n", n1); 18 printf("数値2は=%d\n", n2); 19 return 0; 20}

また、「scanf関数は使えません。」と間違ったことを言っている人がいるので
再入力を scanf だけで実現する例を示します。

C

1#include <stdio.h> 2 3int main(void) 4{ 5 int n1, n2; 6 7 while (1) { 8 printf("数値1="); 9 if (scanf("%d", &n1) == 1 && n1 >= 1 && n1 <= 100) break; 10 scanf("%*[^\n]"); 11 puts("エラーです、1から100までの整数を再入力してください"); 12 } 13 while (1) { 14 printf("数値2="); 15 if (scanf("%d", &n2) == 1 && n2 >= 1 && n2 <= 100) break; 16 scanf("%*[^\n]"); 17 puts("エラーです、1から100までの整数を再入力してください"); 18 } 19 printf("数値1は=%d\n", n1); 20 printf("数値2は=%d\n", n2); 21 return 0; 22}

追記
実は上記の 2つのコードは完璧ではありません。
7 と 3.14 を入力すると 7 と 3 が入力されたものとしてエラーメッセージを出しません。
もちろん、解決策はあります。

投稿2020/07/28 01:43

編集2020/07/28 02:01
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

else ifの丸括弧の中にscanfを書いているのは、何を意図したものなのでしょうか。条件を判定しよとした時点で、入力を受け付ける状態になってしまいます

投稿2020/07/28 01:25

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

考え方から一からやり直しましょう。
入力を受け付けるのは2回。
それに対してscanfが4回も出てきています。
何が入力されるのかわからないのだから、int型と決め打ちで入力させてはダメです。
まずは文字列として入力し、その入力された文字列に不適切な文字がないかをチェックするようにしてください。
この場合、0~9の文字以外が含まれていたらエラー。
0~9だけど、0または100以上の値ならエラー。
エラーでなければ出力して終了。
とすればよいだけです。

投稿2020/07/28 01:25

ttyp03

総合スコア17000

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

要求されている入力は2個だと思いますが,コードにはscanfがたくさんあります.
2個目の数値を無事に入力した後で,次の(存在理由が不明な)scanfの入力待ちになっていると思われます.

投稿2020/07/28 01:24

fana

総合スコア11996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

小数、文字列を入力した場合エラーメッセージがでる。

というのを実現するためには、 scanf関数は使えません。
fgets関数で、文字列として入力を受け取り、整数数値かどうかをチェック、エラーメッセージを出し、
整数変換して、あとの処理に回す必要があります

投稿2020/07/28 01:21

y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問