5

以下は、コンソールからの整数入力を受け入れる単純なコードです。無効な(非整数)入力が与えられるまでは正常に機能します。

 1 #include <stdio.h>
 2 
 3 int main()
 4 {
 5   int x = 0;
 6   int inp = 0;
 7   int nums[20]; 
 8   int idx = 0;
 9   for(;;){
10     printf("Enter an integer: ");
11     inp=scanf("%d", &x);
12     if(inp == 0){
13       printf("Error: not an integer\n");
14     }
15     else{
16       if(idx<20){
17         nums[idx] = x;
18         idx++;
19       }
20     } 
21   }
22   return 0;
23 }

これは、値「g」を入力した後にプログラムをステップ実行することを示す gdb からの出力です。18 行目にジャンプし、その後ユーザーからの入力を探すのに失敗する様子を見てください。

Starting program: /Users/jeffersonhudson/xxxx/hw1 
Enter an integer: g

Breakpoint 1, main () at hw1.c:12
12          if(inp == 0){
(gdb) n
13              printf("Error: not an integer\n");
(gdb) n
Error: not an integer
0x0000000100000ee4  18                  idx++;
(gdb) n
10          printf("Enter an integer: ");
(gdb) n
11          inp=scanf("%d", &x);
(gdb) n

Breakpoint 1, main () at hw1.c:12
12          if(inp == 0){
(gdb) 

これは、間違った入力を与えた後のプログラムの出力です。

Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
Enter an integer: Error: not an integer
^C

誰かが私がここで間違っていることを理解するのを手伝ってもらえますか?

4

3 に答える 3

7

コード内で を検出するif(inp == 0)と、これは実際にはscanf()が何も読み取らなかったことを意味します。最初に見つかったトークンが整数でも空白でもなかったからです。したがって、入力を進めませんでした。破棄するのはあなた次第です。そうしないと、何も読み取らずにスタックします。

scanf で修正する簡単な方法が 2 つあります。

1)それを検出したらinp == 0、 a を呼び出しscanf("%*s");て文字列トークンを破棄します。

2) char の配列に読み込み、atoi(str) で整数値を取得します。例えば:

int idx = 0;
char aux[250]; // watchout for buffer overflows.
for(;;){
    printf("Enter an integer: ");
    scanf("%s", aux); // look at ways to avoid overflows here
    inp = atoi(aux);
    if(inp == 0 && aux[0] != '0'){
      printf("Error: not an integer\n");
    }
    ...

ただし、上記の 2 番目の例では10abc、値の整数などの入力が処理されることに注意してください10。整数以外の文字が存在しないようにする必要がある場合は、データをすばやくスキャンできます。そして、それは宿題の範囲外だと思いますが、将来のバッファオーバーフローに関する問題に注意する必要があります:)

于 2013-05-23T23:46:14.447 に答える
-1

スペース/改行/...などの無効な文字を入力する必要があります。

バッファをクリアするために stdin をフラッシュします。

fflush(標準入力) ANSI C

于 2013-05-23T23:33:08.740 に答える
-1
inp=scanf("%d", &x);

に置き換えます

inp=scanf("%d", &x);
while('\n'!=getchar());
于 2013-05-23T23:50:40.100 に答える