2017-06-06 12 views
0
struct Demo{ 
    char a[50]; 
    char b[50]; 
    int a; 
}; 

  • scanf("[^\n]s",name.a); //where name is the objectを試してみましたそこに、prをしてください私を育てる。

+4

入力はどのように見えますか?それが行単位であれば 'fgets()'が良いはずです。 –

+1

'scanf(...)'のどこかに '%'はありませんか? – Yunnosch

+1

このような良い答えを与える方法はありません。[MCVE](https://stackoverflow.com/help/mcve) –

答えて

2

末尾'\n'トリミングその電位char a[50];にユーザ入力のラインを読み取るために:

if (fgets(name.a, sizeof name.a, stdin)) { 
    name.a[strcspn(name.a, "\n")] = '\0'; // trim \n 
} 

作業は過度に長い入力ラインを消費する、そのようなものとしてname.a[]の最後の要素を使用して対処するために必要とされます。

// Alternative 
if (scanf("%49[^\n]", name.a) == 1) { 
    // consume trailing input 
    int ch; 
    while ((ch = fgetc(stdin)) != '\n' && ch != EOF) { 
    ; 
    } 
} else { // Handle lines of only \n, end-of-file or input error 
    name.a[0] = '\0'; 
} 

scanf("%49[^\n]%*c", name.a) APPR
1)入力は"\n"で、name.aには何も保存されず、'\n'stdinのままです。
2)入力が('\n'以外の)49文字より長い場合、余分な文字が消費されますが、残りの長い入力行は残りの文字がstdinのままです。
これらの問題は両方とも、追加のコードでも解決できます。

+0

余分な部分の存在をチェックするなら、例えば%49 [^ \ n]%c "'のように変更してください。 'fgets'のためにも必要です。 – BLUEPIXY

+0

@BLUEPIXY '"%49 [^ \ n]%* c "'余分な部分を無視しますか? – Yunnosch

+0

@Yunnosch私が話しているのは、OPサンプルコードでは余分な部分があるかどうかを調べていないということです。言い換えれば、 'scanf'だけでなく、必ずテストすることです。 – BLUEPIXY

関連する問題