У меня есть этот код, который получает строку из стандартного ввода:Неожиданное поведение fgets на EOF
char string[USR_SIZE+1];
/*USR_SIZE is 9 */
fgets(string, USR_SIZE, stdin);
size_t len = strlen(string);
if (string[len-1] == '\n') {
// read in whole line, no need to clear buffer
string[len-1] = 0;
}
else {
if(feof(stdin)){
printf("EXACT LEN\n");
}
else{
//username too long, clear stdin and retry
printf("Dumping...");
dump_line(stdin); //clear stdin
/*something that loops until success*/
}
}
Нет новой строки в буфере string
не означает, что либо EOF
или что строка была вырезана.
Теперь. Необходимая оптимальная строка равна "user_123"
(8 символов). Теперь, если я набираю "user_12345678"
, он правильно хранит только "user_123"
и выполняет тело else. Если я набираю "user_123"
, он выполняет и другое тело.
Я хочу отличить строку (EOF
) от "user_1234"
(вырезано) из-за только в этом последнем случае неверный ввод. Почему feof
не задан?
Дополнительная информация: как я могу проверить fgets
значение возвращается к ошибке?
Найдено это решение:
if (fgets(string, USR_SIZE + 1, stdin)){
if (strlen(string) == USR_SIZE && string[USR_SIZE - 1] == '\n'){
printf("EXACT\n");
/* User entered an eight character string. */
string[USR_SIZE - 1] = 0;
}
else{
if(strlen(string) < USR_SIZE-1){
printf("INVALID<<<\n");
/*don't dump*/
}
else{
printf("INVALID>>>\n");
dump_line(stdin);
}
}
printf("EXIT\n");
printf("%s\n", string);
}
else{
free(auth_data);
EXIT_ON_ERROR_("Error while getting user input\n");
}
Не уверен, что вы понятны: просто вводить строку и нажимая клавишу ввода, не будет генерировать EOF, независимо от того, слишком ли он слишком длинный или слишком длинный. – teppic
Я не понимаю. Мне нужно очистить поток, если пользователь вводит строку с более чем 8 символами. Правильно? –
Если пользователь вводит более 8 символов, остаток будет оставлен в stdin, да. Но я думаю, что вы вводите в заблуждение EOF с enter. – teppic