2015-12-31 9 views
5

'割り当てが成功しなかった場合scanfが0を返していることがわかりますが、それが唯一のことですか?これは私のコードです:scanfが0でcを返してもうまく動作しない場合

#include<stdio.h> 
    int main(void) { 
     int val,x; 
     x=scanf("%d",&val); 
    if(x==1) 
     printf("success!"); 
    else{ 
     printf("try again\n"); 
     scanf("%d",&val); 
     } 
    return 0; 
} 

私は番号を入力した場合、それが正常に動作しますが、私は、文字のscanfはもう動作しません入力した場合、これは私が得るものです:

ということを意味
k 
    try again 
    process returned 0 (0x0) execution time :2.578 s 
    press any key to continue. 
    _ 

私は新しい価値を入力することができません、それはなぜですか?コードに何か問題がありますか?はい、どうすれば修正できますか?私はscanfの使用を止めるべきですか?

+3

'scanf'を使用しないでください。 'fgets()'を使って行全体を読み込み、 'sscanf'を使って行内のデータを処理してください。 – Barmar

+2

'sscanf'も使用しないでください。 'fgets()'を使って行全体を読み込み、 'strtol'と友人を使って行内のデータを処理してください。任意の誤った入力に直面しても、これらの機能だけが信頼できます。 – zwol

+0

ありがとう!私はそれらの解決策を試みます! –

答えて

7

scanfが機能しない場合でも、ストリームに無効なデータが残っています。より多くのデータを入力するには、まずストリームからデータを読み込んで破棄する必要があります。機能の

#include<stdio.h> 
int main(void) { 
    int val,x; 
    x=scanf("%d",&val); 
    if(x==1) 
     printf("success!"); 
    else{ 
     // Discard everything upto and including the newline. 
     while ((x = getchar()) != EOF && x != '\n'); 
     printf("try again\n"); 
     scanf("%d",&val); 
    } 
    return 0; 
} 
+0

あなたは 'scanf'を使うよう人々に教えるべきではありません。代わりに代わりの方法を教えるべきです。彼らが何であるか知っていることは分かっています。 – zwol

+0

ありがとうございます!あなたがしたことを説明できるのであれば、どうぞ! –

+0

@ NousSaSmily、 'x = gechar()'は入力ストリームから次の文字を取得します。 'while'ループは、' x'が 'EOF'でなく' '\ n''でない限り、それを続けます。 'x'が' EOF'または '\ n''と等しい場合、プログラムは' while'ループから抜け出します。 –

3

scanf家族は、次のように指定-壊れていると、何のために使うべきではありません。このプログラムを書き込むため

正しい方法は、ユーザ入力の行全体を読むために、そうでなければgetline、利用可能な場合、またはfgetsを使用することです。その後、エラーをチェックするために世話をして、機械の整数に入力を変換するためにstrtolを使用します。

errno = 0; 
result = strtol(line, &endptr, 10); 
if (endptr == line || *endptr != '\n' || errno) 
    // invalid input 
+0

ご協力いただきありがとうございます!やってみます ! –

関連する問題