2012-03-13 4 views
0

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

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: 
+0

В ваших линиях 'fgets' отображается только столько символов, сколько вы им указываете. Если пользователь вводит более того, они остаются для следующих 'fgets'. –

+0

@DavidSchwartz, так что я ничего не могу об этом ?? – Tim

+0

@Tim: просто продолжайте читать, пока не получите новую строку, а затем задайте свой следующий вопрос. Это не ракетостроение, это базовая обработка ввода. – tbert

ответ

1

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

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

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

+0

ОК, что имеет смысл. есть ли вообще в C, чтобы предотвратить переполнение fgets? что-то, что просто игнорирует лишние символы и позволит пользователю ввести имя команды 2 так или иначе? – Tim

+1

Думаю, вам придется написать функцию для себя. Нет сложной задачи, вам просто нужно проверить, что вы получили '\ n' в возвращаемой строке. Если это не так, вам нужно продолжать называть fgets (в другой буфер), пока не найдете «\ n». (fgets останавливается, когда он считывает счетчик-1 символов OR a \ n, в зависимости от того, что наступит раньше). – huelbois

+0

ОК, наконец, понял. я не понял, что fgets нуждается в новой строке. Я думал, что printf с \ n позаботился об этом, fflush тоже ничего не делал. насмехаясь над тем, что это не ракетостроение, тоже не помогло. – Tim

1

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

Смежные вопросы