プロが教える店舗&オフィスのセキュリティ対策術

#include <stdio.h>
int main(void)
{
char name[10];
int no;

printf("ナンバーを入力してください: ");
scanf("%d",&no);/* 35を入力 */
printf("文字列を入力してください: ");
fgets(name,10,stdin);/*入力できない*/

return 0;
}

この例文だと、fgets関数が改行コードを読み取って、終了してしまい文字列入力が出来ないみたいなんですが、scanfの後にfgetsを使うような(scanfとfgetsの間にscanfの残した?改行コードを取り除く方法)処理はどのような方法があるのでしょうか?

試しにfgets文を2度書いたら思っていた動作をしてくれたのですが、はたしてfgets文を2度書くというような事をしていいものなのでしょうか?見た目もなんだか変な感じですし。。↓

#include <stdio.h>
int main(void)
{
char name[10];
int no;

printf("ナンバーを入力してください: ");
scanf("%d",&no);/* 35を入力 */
printf("文字列を入力してください: ");
fgets(name,10,stdin);
fgets(name,10,stdin);  /*入力できる*/
return 0;
}

A 回答 (4件)

余計なfgetsを削除し


scanf("%d",&no);

scanf("%d",&no);
scanf("%*[^\n]%*c");
にする。

#include <stdio.h>
int main(void)
{
char name[10];
int no;

printf("ナンバーを入力してください: ");
scanf("%d",&no); /* 35を入力 */
scanf("%*[^\n]%*c");
printf("文字列を入力してください: ");
fgets(name,10,stdin); /*入力できる*/
return 0;
}

「35<Enter>」と入力すると、scanfは「35」までを数値に変換し、noに代入します。

入力ストリームにある「<Enter>」は「置き去り」にされます。

その後

scanf("%*[^\n]%*c");

を実行すると「%*[^\n]で、改行以外の文字があるなら、改行の手前にある文字をすべて読み捨て」してから「%*cで、次の文字、つまり、改行を読み捨て」します。

これで「置き去りにされた<Enter>」が入力ストリームから居なくなります。

あとは、普通にfgetsするだけ。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

思っていた動きをしたのですが次のようなソースにした場合、文字列が入力できませんでした・・・(ナンバー、基本地しか入力できない)環境はVisual c++ 2010です。

#include <stdio.h>

int main(void)
{
char name[10];
int no,kihon;

printf("ナンバーを入力してください: ");
scanf("%d",&no); /* 35を入力 */
scanf("%*[^\n]%*c");

printf("文字列を入力してください: ");
fgets(name,10,stdin);

printf("基本値を入力してください:");
scanf("%d",&kihon);
return 0;

}

ただBorland C++ Compiler 5.5で実行すると希望の動作になりました(ナンバー、文字列、基本値の3つの入力が可能。)

どこが悪いんでしょうか・・

お礼日時:2011/10/29 07:40

そもそも、対話式に入力したいのなら、一切scanfをつかわず、全部fgetsで入力し、必要に応じてsscanf等を使う。


scanfの戻り値をチェックしてないのもだめです(sscanfもチェック要)。
    • good
    • 0
この回答へのお礼

なるほど・・・そういうやり方もあるのですね。勉強になりました。

お礼日時:2011/10/29 19:09

因みに。



「改行以外の文字があるなら、改行の手前にある文字をすべて読み捨て」

と言う処理をするのは、最初の入力で「35,123,aaa<Enter>」とかって入力されるかも知れないから。

なので「35」と「<Enter>」の間にある、余計な文字列「,123,aaa」を読み捨てするのです。
    • good
    • 0

いろいろとやり方はある.



ベタに
int ch;
while ((ch = getchar()) != '\n');
でもいいし.
    • good
    • 0
この回答へのお礼

そういうやり方があるんですね。勉強になりました。ありがとう。

お礼日時:2011/10/29 07:32

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!