2

私はこの問題を抱えています。私の名前はchar[20]です。ある文字を挿入すると、配列がオーバーフローし、他の配列(cognome)に書き込みます。

scanf()をputs()で変更しようとしましたが、この最後の1つは入力からジャンプして何も読み取らないため、正しく機能しません。


誰かが解決策を知っていますか?

これがコードです

void addStudent(){
    struct student s;
    printf("Inserire Nome: ");
    scanf("%20s",s.nome);
    printf("\nInserire Cognome: ");
    scanf("%30s",s.cognome);
    printf("\nInserire eta': ");
    scanf("%d",&s.anni);
}

結果

Inserire Nome: cjhsdjkhbsdkhfgsdjkhfgskjhgjkhsfs

Inserire Cognome: 
Inserire eta': 
4

2 に答える 2

6

に変更し"%19s"ます。scanf()nullターミネータを書き込むため、配列サイズより1つ小さくする必要があります。呼び出し後、scanf()未処理の入力をスキップする必要があります。これは、次の改行文字まで読み取ることで実現できます。

int ch;
while ((ch = getchar()) != EOF && ch != '\n');
于 2012-11-13T17:30:52.147 に答える
0

1文字ずれている場合は、ヌルバイトに1文字残しておく必要があります。同じことが当てはまります。s.cognome

scanf("%19s",s.nome);

また、交換可能ではscanfありputsません。最初のものは何かを読み取り、2番目のものは何かを出力しgetsますfgets

fgets(s.nome, 20, stdin);
于 2012-11-13T17:35:33.353 に答える