Domanda

Davvero confuso se il mio programma si sta comportando nel modo in cui dovrebbe.Questo non è compito, solo un divertente programma di predittori di marzo Madness che sto scrivendo.

    char buffer[20];
    char team1_name[20];    // 18 chars + new line + null
    char team2_name[20];

    printf("Who is team 1?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team1_name, buffer, sizeof(team1_name));
    team1_name[strlen(team1_name) - 1] = '\0';

    printf("\nWho is team 2?\n");
    fgets(buffer, sizeof(buffer), stdin);
    strncpy(team2_name, buffer, sizeof(team2_name));
    team2_name[strlen(team2_name) - 1] = '\0';

    printf("\nEnter %s's info:\n", team1_name);
.

Fuori dalla curiosità Inserisci un nome di squadra superiore a 20 caratteri e salta completamente sulla seconda dichiarazione di stampa.Sto proteggendo contro il buffer overflow?È all'utente di non mettere in qualcosa di enorme?Ho bisogno di dichiarazioni a filo?

Questa è l'output:

    Who is team 1?
    wjefowiejfwoiejfweoifjweoifjweofijweoifj

    Who is team 2?

    Enter wjefowiejfwoiejfwe's info:
    Wins in last 12:

    Losses in last 12:

    Points per game:
.

È stato utile?

Soluzione

Il problema è che, poiché il tuo ingresso viene troncato nei primi figt (hai più di 20 caratteri), il secondo fente leggerà la fine della prima stringa di ingresso da STDIN.

Visualizza il valore "team2_name" per vederlo (contiene caratteri dopo i 20 nuovi caratteri in Team1_Name).

Oops, mi dispiace, il seguente commento è stato sbagliato.Dimenticalo : E sì, i fget devono usare Sizeof (buffer) -1, perché questo argomento è il numero massimo di caratteri di caratteri.Quindi, se leggi Sizeof (buffer) caratteri, avrai bisogno di dimensioni di (buffer) +1 caratteri per memorizzarli (incluso il trailing '\ 0')

Altri suggerimenti

Leggi 20 caratteri da Stdin, ma il resto dell'ingresso rimane ancora nel flusso.Il prossimo fgets legge quei caratteri rimanenti, quindi il team1 è chiamato wjefowiejfwoiejfwe e team2 oifjweofijweoifj.Stampa anche il nome del team2 e vedrai questo è vero.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top