Вопрос

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

    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 символов, и оно полностью пропускает вторую инструкцию печати.защищаю ли я от переполнения буфера?зависит ли это от пользователя, чтобы он не вставлял что-то огромное?Нужны ли мне инструкции по сбросу?

Это и есть результат:

    Who is team 1?
    wjefowiejfwoiejfweoifjweoifjweofijweoifj

    Who is team 2?

    Enter wjefowiejfwoiejfwe's info:
    Wins in last 12:

    Losses in last 12:

    Points per game:
Это было полезно?

Решение

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

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

Упс, извините, следующий комментарий был неверным.Забудь об этом : И да, fgets должен использовать SizeOf (буфер) -1, потому что этот аргумент является максимальным количеством чтения символов.Поэтому, если вы читаете SizeOf (Buffer) Chars, вам потребуется SizeOf (Buffer) +1 Chars для их хранения (включая Training '\ 0')

Другие советы

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top