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

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

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

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

Q&A

解決済

1回答

1800閲覧

なぜか二回出力される。

takadaibuoyancy

総合スコア17

C

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

0グッド

0クリップ

投稿2020/08/15 15:46

問題点

以下のコードは,検証を行うために書いたものです。ですので、「このコードだとwhile文から抜けられない」などの回答は無用です。

実行するとまず1回目のループでfgetsによる入力待ちの状態になり、何かしら入力した後今度はscanfによる入力待ちになります。そして何かしら入力して、2回目のループに入ると今度はfgetsによる入力待ちの状態にはならず、scanfの入力待ちの状態になります。
これはどういうことなのでしょうか。fgetsについての勉強不足なのでしょうが、どう調べても探すことができなかったのでお聞きしたいです。

#include<stdio.h> #include<string.h> #define N 100 int main(){ char sent[N]; int i; while(1){ printf(">"); fgets(sent,N,stdin); printf("?>"); scanf("%d",&i); } return 0; }

よろしくお願いしますm(__)m

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

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

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

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

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

guest

回答1

0

ベストアンサー

scanfでは末尾の区切り文字(半角スペース,タブ,改行)が入力バッファに残るからです。
そのため次のfgetsでは改行が取得されます。
scanfに対して数値の後に半角スペース区切りで文字列を入力した場合、次のfgetsでは半角スペース以降が取得されます。

C

1 int i; 2 scanf("%d", &i); 3 char c=0; 4 scanf("%c", &c); 5 printf("%d\n", c);

として数値の後に改行を入力すれば、数値読み取り後に入力バッファに改行(10:\n)が残っていることが確認できます。
(%cは区切り文字も読み込めるため確認できます)


以下のようにすると数値以降の改行まで読み捨てられます。
書式文字列を一つにまとめてしまうと、数値の後すぐに改行がある場合や数値以外が入力された場合に書式文字列にマッチしなくなるためうまくいきません。

C

1 scanf("%d", &i); 2 scanf("%*[^\n]");//改行文字以外を読み捨て 3 scanf("%*c");//改行文字を読み捨て

投稿2020/08/15 15:56

編集2020/08/15 18:10
SHOMI

総合スコア4079

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問