teratail header banner
teratail header banner
質問するログイン新規登録

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

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

新規登録して質問してみよう
ただいま回答率
85.30%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

1621閲覧

scanf関数、数値、文字、エラー処理

yatai

総合スコア4

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2021/08/15 14:42

0

0

N個の整数を入力し、出力した物の合計、平均、標準偏差を出力するプログラムを考えています。
8割方できたのですが、最初にscanf関数で数値以外を入力したときにエラーを表示させて、再度数値の入力を求めるようにしたいです。
よろしくお願いします。

C

1#include <stdio.h> 2#include <math.h> 3#define N 10 4 5main() 6{ 7 int i, data[N]; 8 double sum=0; 9 10 printf("%d", N); 11 printf("個の整数を入力してください\n"); 12 13 for(i = 0 ; i < N ; i++) 14 { 15 printf("入力データ = "); 16 scanf("%d", &data[i]); 17 } 18 19 printf("%d", N); 20 printf("個の整数を出力します\n"); 21 22 for(i = 0 ; i < N ; i++) 23 { 24 printf("出力データ = "); 25 printf("%d\n", data[i]); 26 27 sum += data[i]; 28 } 29 30 printf("%d", N); 31 printf("個の整数の合計を出力します\n"); 32 printf("合計 = %.0f\n", sum); 33 34 printf("%d", N); 35 printf("個の整数の平均と標準偏差を出力します\n"); 36 37 double ave = sum/N; 38 double sd = 0; 39 40 for(i = 0 ; i < N ; i++) 41 { 42 sd += (data[i]-ave)*(data[i]-ave); 43 } 44 sd /= N; 45 printf("平均 = %.2f\n標準偏差 = %.2f\n", ave, sqrt(sd)); 46 47 return 0; 48}

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

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

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

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

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

guest

回答1

0

ベストアンサー

不正な入力を想定する端末入力にscanfを使うのは間違った考え方です。fgets+sscanfを使います。

C

1char line[1000]; 2~~~ 3 for(i = 0; i < N; i++){ 4 do{ 5 printf("入力データ %d = ",i); 6 if(!fgets(line, sizeof line, stdin)){ 7 "エラー処理"; 8 } 9 }while(sscanf(line, "%d", &data[i])!=1); 10 }

投稿2021/08/15 14:59

otn

総合スコア86341

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

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

yatai

2021/08/15 15:40

ありがとうございます。 勉強中なので助かります。 こちらをmain()の前に挿入する形で大丈夫でしょうか?
otn

2021/08/15 15:59 編集

コードの意味がわからないのでしょうか? どの辺が分かりませんか?
yatai

2021/08/15 16:26

すみません。まだ勉強不足で、曖昧です。 自分でも調べてみます。 charをmain()の中、教えて頂いたforを最初のforに置き換える と考えたのですがどうでしょうか?
otn

2021/08/15 16:35

入力処理を書き換えたいという質問に対して、入力処理を回答したので、元の入力処理をそれで置き換えるのが当然でしょう。 質問が来たのでびっくりしたのですが、回答のコードが入力処理であることが分からなかったのかな?と思いました。
yatai

2021/08/15 16:44

失礼いたしました。 コードを書き換えたところ、文字を入力しても大丈夫になりました。 しかし、入力処理がループするようになってしまいました。(今はdefineで10個の入力にしているのに) 対策はあるでしょうか?
otn

2021/08/15 16:49

> 入力処理がループするようになってしまいました。 具体的にどういうことでしょうか?
yatai

2021/08/16 07:32

本来ならば10個のデータを入力後、合計などが出力されるのですが、 エラー処理を導入後は延々と入力を求められ、合計などが出力されなくなりました。
otn

2021/08/16 08:51

コードを見ないと何とも。
yatai

2021/08/16 09:33

お願い致します。 #include <stdio.h> #include <math.h> #define N 10 main() { int i, data[N]; double sum=0; char line[1000]; printf("%d", N); printf("個の整数を入力してください\n"); for(i = 0 ; i < N ; i++) { do { printf("入力データ = "); scanf("%d", &data[i]); if(fgets(line, sizeof line, stdin)) { "エラー処理"; } }while(sscanf(line, "%d", &data[i])!=1); } printf("%d", N); printf("個の整数を出力します\n"); for(i = 0 ; i < N ; i++) { printf("出力データ = "); printf("%d\n", data[i]); sum += data[i]; } printf("%d", N); printf("個の整数の合計を出力します\n"); printf("合計 = %.0f\n", sum); printf("%d", N); printf("個の整数の平均と標準偏差を出力します\n"); double ave = sum/N; double sd = 0; for(i = 0 ; i < N ; i++) { sd += (data[i]-ave)*(data[i]-ave); } sd /= N; printf("平均 = %.2f\n標準偏差 = %.2f\n", ave, sqrt(sd)); return 0; }
otn

2021/08/16 09:42

scanfを消し忘れてます。見直しても気づいてないの???ぼんやりしすぎです。しっかり見ましょう。 あと、"エラー処理" の中身は書いてないの??
yatai

2021/08/16 10:37

根本的にまだ理解できていませんでした。 すみません。精進します。
otn

2021/08/16 11:17

まるごとコピペすれば消し忘れミスなど発生しないのに。。。 ミスを防ぐ作業方法を採用しましょう。
yatai

2021/08/16 12:26

心がけていきます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.30%

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

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

質問する

関連した質問