3

与えられた入力が整数入力かどうかを確認したかったのです。入力を文字列に保存したくありませんでした。stackoverflow に関するいくつかの質問とヒット アンド トライアルを見て、次のコードを作成しました。

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    if(a == '\n')
        scanf("%c",&a);
    else
    {
        while(a != '\n')
            scanf("%c",&a);
    }
}

それは機能しますが、私の理解によれば、以下も機能するはずです

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    while(a != '\n')
        scanf("%c",&a);
}

上記がうまくいかなかった理由を誰か教えてもらえますか?? また、誰かがより良い解決策を持っている場合は、それも教えてください。

注:12qweも無効な入力と考えています。整数が欲しいだけです。

4

3 に答える 3

3

の問題

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    while(a != '\n')
        scanf("%c",&a);
}

つまり、スキャンの前aに含まれている場合'\n'、スキャンが失敗すると、内部whileループはまったく実行されません。それで

  • intたとえば、入力が入力ストリームからの解析に失敗した場合、問題のある入力は入力ストリームに残り、外側のループ制御"ab c\n"の次の入力は再度解析に失敗し、残り、繰り返します。scanfwhileinta'\n'

  • ストリームからに文字を読み込む前に入力エラーが発生した場合は、ストリームascanf破損しているために外部ループ制御で失敗します。繰り返してください。

他のバージョンでは、

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    if(a == '\n')
        scanf("%c",&a);
    else
    {
        while(a != '\n')
            scanf("%c",&a);
    }
}

ストリームから読み取る入力がある限り、少なくともある程度の進歩があります。これは、何aが含まれていても、次の.の解析を試みる前に、入力ストリームから少なくとも1文字を読み取るためintです。また、空のファイルからstdinをリダイレクトする場合など、入力ストリームが破損/クローズ/途中で終了した場合も、無限ループが発生します。"Please enter an integer only : "`" a \ nb \ nc \ nd \ n "のような入力を与えることで、そのループに複数のメッセージを出力させることもできます。

scanfしたがって、入力から何かを変換する前に、ストリームの終わりまたはその他の読み取りエラーが発生したかどうかを確認し、その場合は中止する必要があります。

int reads;
while(((reads = scanf("%d%c", &num, &a)) != 2 && reads != EOF) || a != '\n')
{
    printf("Please enter an integer only : ");
    // read at least one character until the next newline
    do {
        reads = scanf("%c", &a);
    }while(reads != EOF && a != '\n');
}
于 2012-10-24T15:23:04.567 に答える
1

これは間違った方法です。を使用して入力を読み取り、fgets()文字列を解析して整数の ASCII 範囲を求めることができます。

fgets(s, 1024, stdin)

for (i=0; s[i] ! = '\0';i++) {
if( s[i] <'0' && s[i] >'9')
  // not an integer<br>

などisalnumの標準機能も使用できます。isalpha

于 2012-10-24T13:11:54.007 に答える
1

それは機能します……</p>

while(scanf("%d%c",&num,&a) != 2 || a != '\n')
{
    printf("Please enter an integer only : ");
    do{
        scanf("%c",&a);
    }while(a != '\n');
}
于 2012-10-24T14:44:07.110 に答える