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

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

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

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

Q&A

解決済

4回答

1300閲覧

配列と繰り返しについて

hiramouse

総合スコア7

C

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

0グッド

0クリップ

投稿2017/10/07 00:17

###前提・実現したいこと
お世話になります、C言語初心者です。
10個の整数を配列に1つづつ入力し、その整数の和を出力したいのですが、全ての出力処理が1周遅れている?ようです。
コードを実行し、1つ目の値を入力してもprintfは出力されず、2つ目の値を入力した段階で「1つ目の値が入力されたのは(値)です」と出力されます。最後の合計値出力も、10個目の値を入力しても出力されず、11個目の値(この入力処理もいらない)を適当に入れてやっと出力されます。

入力した値をその直後に確認できるようにし、10個目の値を入力した時点で合計値を出力して処理を終了させるにはどう修正すれば良いのでしょうか?
以下のコードで1つ目の値を入力した直後にprintfが発動しない理由も合わせてご教授いただければ幸いです。
よろしくお願いいたします。

###該当のソースコード

C

1#include <stdio.h> 2int main() 3{ 4 int i; 5 int sum = 0; 6 int data[10] = {0}; 7 for(i = 0; i < 10; i++){ 8 scanf("%d\n", &data[i]); 9 printf("入力されたのは%dです\n", data[i]); 10 sum = sum + data[i]; 11 /*printf("デバッグ:data[0]の値は%dです\n", data[0]); 12 printf("デバッグ:data[1]の値は%dです\n", data[1]); 13 printf("デバッグ:data[2]の値は%dです\n", data[2]); 14 printf("デバッグ:data[3]の値は%dです\n", data[3]); 15 printf("デバッグ:data[4]の値は%dです\n", data[4]); 16 printf("デバッグ:data[5]の値は%dです\n", data[5]); 17 printf("デバッグ:data[6]の値は%dです\n", data[6]); 18 printf("デバッグ:data[7]の値は%dです\n", data[7]); 19 printf("デバッグ:data[8]の値は%dです\n", data[8]); 20 printf("デバッグ:data[9]の値は%dです\n", data[9]);*/ 21 } 22 printf("合計は%dです\n", sum); 23 return 0; 24} 25

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

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

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

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

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

guest

回答4

0

ベストアンサー

scanfの\nをとればよろしいかと

c

1 scanf("%d", &data[i]);

投稿2017/10/07 00:31

A.Ichi

総合スコア4070

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

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

hiramouse

2017/10/07 00:48

簡潔かつ的確なご回答ありがとうございました。 何でも改行しておけば良いというわけではないのですね。
guest

0

scanf関数に与える書式指定文字列から\nを削除ください。

C

1scanf("%d", &data[i]);

書式指定としての\nは「その位置に改行文字を要求する」ことを意味します。つまり"%d\n"は「数値+改行文字」の入力を待機するため、「1, (改行a), 2, (改行b)」という入力に対し改行aは"改行文字"として消化されてしまい、(改行b)でやっと1回目のscanf呼び出しが完了します。このとき2は解釈されずに残っているため、次回のscanf呼び出しで消化されるという動きになります。

投稿2017/10/07 00:58

編集2017/10/07 01:05
yohhoy

総合スコア6189

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

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

hiramouse

2017/10/07 11:48

ご回答ありがとうございます。 根本的な原因がわかり、大変参考になりました。
guest

0

scanf("%d", &data[i]);

キーボードからの入力に対して、scanf関数を使うのは難しいので、初心者は使わない方が良いです。
fgets+sscanfを使いましょう。また、scanf sscanfの返り値は必ずチェックしましょう。

投稿2017/10/07 00:34

otn

総合スコア84423

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

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

hiramouse

2017/10/07 00:52

ご回答ありがとうございます。 scanfに変わる関数…勉強してみます。 返り値のチェックはエラー対策になるようですね、大変参考になりましたm(_ _)m
guest

0

printfですぐに出力されるわけではなく、バッファにためこんでおいて後でまとめて出力されることがあります。

fflush(stdout);

をprintfの後に入れるとバッファに溜まっているのを出力させることができます。

投稿2017/10/07 00:31

shimitei

総合スコア799

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

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

shimitei

2017/10/07 00:37

他の方の回答のようにscanfの使い方の問題でした。
hiramouse

2017/10/07 00:49

ご回答ありがとうございます。 有用な情報だということは変わりないと思います。 勉強させていただきましたm(_ _)m
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問