2016-11-03 7 views
1

小さなワーカーレジスタを作成しようとしましたが、アドレス値を取得する2番目のscanfを完全にスキップします。私は初心者なので、何が間違っているのか分かりません。コードは次のとおりです。scanfはスキップされます(?)

#include <stdio.h> 

int main() 
{ 
    // var 
    char n[256], ad[256]; // n - Name, ad - Address 
    int i, ag; // i - Income, ag - Age 
    // code 
    printf("Welcome to the Worker Register\n\nWorker Data\n\nName: "); 
    scanf("%255[^\n]", n); 
    printf("Address: "); 
    scanf("%255[^\n]", ad); 
    printf("Age: "); 
    scanf("%d", &ag); 
    printf("Income: R$"); 
    scanf("%d", &i); 
    printf("Worker %s\nAddress: %s\nAge: %d\nIncome: R$%d", n, ad, ag, i); 
    return 0; 
} 

本当にありがとうございます。

答えて

1

ナドのハックは)それを修正するようだが、私があなただったら、私は読書の文字列をscanf関数を使用することはありません。

代わりに文字列を読むfgets()を使用する方がいいです。文字列のscanfには問題があります。参照:Reading a string with scanf

#include <stdlib.h> 
... 
printf("Welcome to the Worker Register\n\nWorker Data\n\nName: "); 
fgets(n, 256, stdin); 
... 

fgets()については、 manページ状態:

のfgets()ストリーム からsize文字未満で、ほとんど1で読み込み、 格納したバッファにsが指します。読み取りは、 EOFまたは改行の後に停止します。改行が読み取られた場合、改行はバッファに格納されます。 最後のヌルバイト( '\ 0')は、 の最後の文字の後に格納されます。

したがって、バッファのサイズを入力して、nullバイトを無視します。これは、fgetsがあなたのために機能するためです。

+0

はい、私はそのスレッドとそのようないくつかのスレッドを読んだが、私はCコースの始めにいるので、ポインタは何か分からない。私はそれを学んだことがありましたが、私はそれをよく理解できませんでしたので、私は今のところ脇に置いて、勉強するときに戻ってきます。ありがとうございました! @編集:fgetsはどのライブラリからですか? – Gibas

+0

'fgets()'は 'scanf()'と同じライブラリにあります。 – chux

+0

バッファオーバーフローについては、 "fgets(n、255、stdin);" "fgets(n、256、stdin);"の代わりに? – Gibas

1

単にgetchar()を追加するだけです。正直言って、私はなぜそれが学校で何回も私に起こったのか分からない。それはそれを修正するように見えた:)

コード:(getchar関数を追加する

#include <stdio.h> 
int main() 
{ 
    // var 
    char n[256], ad[256]; // n - Name, ad - Address 
    int i, ag; // i - Income, ag - Age 
       // code 
    printf("Welcome to the Worker Register\n\nWorker Data\n\nName: "); 
    scanf("%255[^\n]", n); 
    printf("Address: "); 
    getchar(); 
    scanf("%255[^\n]", ad); 
    printf("Age: "); 
    scanf("%d", &ag); 
    printf("Income: R$"); 
    scanf("%d", &i); 
    printf("Worker %s\nAddress: %s\nAge: %d\nIncome: R$%d", n, ad, ag, i); 
    return 0; 
} 
+0

getchar()は実際に何をしていますか? @編集:それを使うために必要なライブラリは? – Gibas

+1

'ad'を読んだ後に' getchar() 'が必要ない理由を説明するのは親切かもしれません。あなたはそれが絶対必要なわけではありませんが、なぜすぐには分かりません。それは私のコードだったので、対称性の理由からそこにあるでしょう。おそらく 'scanf()'が単にそれを仮定しているのではなく動作することを確認するべきでしょう。 –

+0

わかりませんが、もっと読むことができます[リンク](http://stackoverflow.com/questions/3676796/what-does-getchar-exactly-do)**ここで** – Nad

0

"%255[^\n]"(改行以外の入力を受け付ける)改行までの入力を意味する。(改行が含まれていない。)
だから、(STDINの)入力バッファ内の改行があり、
第二のscanf(scanf("%255[^\n]", ad); )は、改行以外の入力も受け付けます。
したがって、入力されません。

したがって、最初のscanfで改行を使用する必要があります。
例:scanf("%255[^\n]%*c", n);%*cは、1文字(改行)を無視します。

第3のscanfの%dは、前の空白をスキップするので、第2のscanfにはは必要ありません。

関連する問題