2016-11-09 19 views
3

私はCでプログラミングしたことがなく、今日は小さなコードを書く必要があります。プログラムは非常に簡単です - 私は2つの整数を追加したいです。 しかし、与えられた入力が数値で、最初のscanfが0を返すかどうかを調べようとすると、2番目の入力は入力を待たずに0も返します。 コード:Scanfは入力を待たずに0を返します

int main() 
{ 
    int a = 0; 
    int b = 0; 
    printf("Number a:\n"); 
    if (scanf("%d", &a) != 1) 
    { 
     printf("Not a number. a=0!\n"); 
     a = 0; 
    } 
    printf("Number b:\n"); 
    if (scanf("%d", &b) != 1) 
    { 
     printf("Not a number. b=0!\n"); 
     b = 0; 
    } 
    printf("%d\n", a+b); 
    return 0; 
} 
+0

あまりにも多くの問題は、その最初のステップをしないことに起因します。少なくともこの投稿はその重要なステップでした。 – chux

答えて

1

最初scanf()が失敗したら、それは、おそらく失敗に一致するのである、とのマッチングの失敗の原因となった入力からである次の呼び出しによって消費されるのを待って、入力バッファ内に残留します。

したがって、scanf()次の呼び出しは、入力バッファが空でないと明示的な外部ユーザの入力を待たずに、すぐに入力バッファに存在する同じ無効入力を消費してみてください。

ソリューション:最初の入力はscanf()のために失敗した後、あなたが入力バッファをクリーンアップする必要があるが、簡単な例のために、while (getchar() != '\n');のようなものは、仕事をする必要があります。

+0

改行もチェックしたいかもしれません。 – dbush

+3

関数内で最良にラップされたもう少し複雑なwhileループが必要です。入力バッファが空のときにEOFが読み込みを停止しない限り読み込みがブロックされます。それはEOFでのみ終了します。つまり、ユーザーがctrl-d(Unixシェル)またはctrl-Z(Windowsターミナル)などを入力したことを意味します。 – hyde

+0

@hydeはい、基本的には正しいです、私はちょうどアイデアを描きたかった、それだけです。 –

0

これは、入力と出力がCで同期していないためです。プログラムは、入力が読み取られていない間にユーザーの入力の後にいくつかの行を出力できます。 1行で

char token; 

scanf("%c", &token); 
printf("%c\n", token); 
printf("line 1\n"); 

scanf("%c", &token); 
printf("%c\n", token); 
printf("line 2\n"); 

scanf("%c", &token); 
printf("%c\n", token); 
printf("line 3\n"); 

入力ABC:このコードを実行するようにしてください。

2つのコンソール(入力用と出力用)があるように想像することができます。


は、たとえば、あなたが入力ASDaためbためにしたいです。この場合、最初のscanfは数字を検出せず、0を返しますが、入力からは何も読み取られません。このため、第2のscanfと表示されます。も表示されます。

入力をクリアするaは数ではない場合、あなたは'\n'まで入力行の残りのすべての文字を(@のSouravのソリューションを見て)

1

のため数に変換することができなかった入力すべき最初にfscanf()が標準入力のバッファに保留されており、2番目のfscanf()も失敗します。怒ら入力して再プロンプトユーザーを破棄してみてください。ユーティリティ関数を使用してコードを因数分解

#include <stdio.h> 

int main(void) { 
    int a = 0; 
    int b = 0; 
    int c; 
    printf("Number a:\n"); 
    while (scanf("%d", &a) != 1) { 
     printf("Not a number, try again:\n"); 
     while ((c = getchar()) != EOF && c != '\n') 
      continue; 
     if (c == EOF) 
      exit(1); 
    } 
    printf("Number b:\n"); 
    while (scanf("%d", &b) != 1) { 
     printf("Not a number, try again:\n"); 
     while ((c = getchar()) != EOF && c != '\n') 
      continue; 
     if (c == EOF) 
      exit(1); 
    } 
    printf("%d\n", a + b); 
    return 0; 
} 

はそれがより明確になります:

#include <stdio.h> 

int get_number(const char *prompt, int *valp) { 
    printf("%s:\n", prompt); 
    while (scanf("%d", valp) != 1) { 
     printf("Not a number, try again:\n"); 
     while ((c = getchar()) != EOF && c != '\n') 
      continue; 
     if (c == EOF) 
      return 0; 
    } 
    return 1; 
} 

int main(void) { 
    int a, b; 

    if (!get_number("Number a", &a) || !get_number("Number b", &b)) { 
     return 1; 
    } 
    printf("%d\n", a + b); 
    return 0; 
} 
0

あなたはscanf関数で問題なく文字列を使用して同じことを行うことができます。ユーザー入力を文字列として整数に変換するだけです。次に、文字列を整数に変換して、それらが同じかどうかをチェックします。それらが同じ場合は、aとbを整数として扱います。そうでなければ、あなたがすることを行います(string.hを含める必要があります)。入力コード `...!= 1`の返り値をチェックするためのUVは以下の通りです:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
int a; 
int b; 
char str1[100]; 
char str2[100]; 

printf("Number a:\n"); 
scanf("%s", &str1); //take input as a string 
a = atoi(str1); //convert string to integer 
snprintf(str2, 100, "%d", a); //convert integer back to string 

//if the integer converted to string is not the same as the string converted to integer 
if (strcmp(str1, str2)!= 0) 
{ 
printf("Not a number. a=0!\n"); 
a = 0; 
} 
printf("Number b:\n"); 
scanf("%s", &str1); 
b = atoi(str1); 
snprintf(str2, 100, "%d", b); 

if (strcmp(str1, str2)!= 0) 
{ 
printf("Not a number. b=0!\n"); 
b = 0; 
} 
printf("%d\n", a+b); 

return(0); 
} 
関連する問題