2

scanf() 関数の戻り値を取得するために、このテスト プログラムを作成しました。

ただし、テストでは、整数を入力するとプログラムは正常ですが、文字列を入力すると無限ループに陥ります。誰がその理由を説明できますか?

もう 1 つのことは、ASCII コード 0 を表すエスケープ文字 \0 ですか? 「\12」を印刷すると改行されますが、「\9」を印刷すると「TAB」が取得できませんでした (TAB の ASCII コードは 9 です)。

#include <stdio.h>

int main(void){
    int x;
    int temp;
    //printf("\13");
    for(;;){
        temp=scanf("%d",&x);
        printf("%i",temp);
    }

}
4

3 に答える 3

4

入力がフォーマット指定子と一致しない場合、scanf()は入力を破棄しないため、無限ループが発生します。

 for(;;){
        temp=scanf("%d",&x);
      if(temp == 0) { // Input failure
          perror("invalid input");
          break;
       }
        printf("%i",temp);
    }

入力が無効になった後もループを続行したい場合は、入力を読み取って自分でフラッシュします。

于 2013-01-31T22:11:05.893 に答える
3

scanfフォーマット文字列で要求した内容を読み取れない場合は、入力ストリームにデータを残すだけで、次回はデータを再度読み取り、再度失敗するなど、永遠に続きます。入力を空にする必要があります。

また、標準によれば、ASCIIに依存するべきではありません。ただし、はい'\0'はヌル文字であり'\t'、ハードコードされたASCII値の代わりに使用する必要があります。

于 2013-01-31T22:10:51.153 に答える
3

あなたはscanf整数を読むように言っています。文字列を入力するscanfと、整数の入力を待ちます。scanfまた、入力をパージしないため、同じことを何度も読み取ります。temp成功した読み取りの数を返す何かを正常に読み取ったときの値を確認する必要があります。あなたの場合、文字列入力では0を返す必要があります。

また、出力先と使用するシェルによっては、タブ出力が無視されたり、解釈が異なる場合があります。

于 2013-01-31T22:07:17.773 に答える