Это переполнение буфера? - PullRequest
0 голосов
/ 13 марта 2012

Действительно сбит с толку, если моя программа ведет себя так, как она должна.это не домашнее задание, я просто пишу забавную программу для предсказателей безумия.

    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);

Из любопытства я ввожу название команды длиной более 20 символов, и оно полностью пропускает второй оператор печати.я защищаю от переполнения буфера?это до пользователя, чтобы не вставить что-то огромное?Нужны ли мне инструкции flush?

Это вывод:

    Who is team 1?
    wjefowiejfwoiejfweoifjweoifjweofijweoifj

    Who is team 2?

    Enter wjefowiejfwoiejfwe's info:
    Wins in last 12:

    Losses in last 12:

    Points per game:

Ответы [ 2 ]

1 голос
/ 13 марта 2012

Вы прочитали 20 символов из стандартного ввода, но остальная часть ввода все еще остается в потоке. Следующий fgets читает эти оставшиеся символы, поэтому Team1 называется wjefowiejfwoiejfwe и Team2 oifjweofijweoifj. Напечатайте также имя Team2, и вы увидите, что это правда.

1 голос
/ 13 марта 2012

Проблема в том, что, поскольку ваш ввод усекается в первых fgets (у вас более 20 символов), тогда второй fgets будет читать конец входной строки FIRST из stdin.

Показать значение «team2_name», чтобы увидеть его (оно содержит символы после 20 первых символов в team1_name).

Упс, извините, следующий комментарий был неверным. Забудь об этом : И да, fgets ДОЛЖЕН использовать sizeof (buffer) -1, потому что этот аргумент является максимальным количеством прочитанных символов. Так что, если вы читаете символы sizeof (буфера), вам понадобится sizeof (буфера) +1 символа для их хранения (включая завершающий '\ 0')

...