2013-03-29 2 views
0

У меня есть этот код, который получает строку из стандартного ввода:Неожиданное поведение 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"); 
} 
+0

Не уверен, что вы понятны: просто вводить строку и нажимая клавишу ввода, не будет генерировать EOF, независимо от того, слишком ли он слишком длинный или слишком длинный. – teppic

+0

Я не понимаю. Мне нужно очистить поток, если пользователь вводит строку с более чем 8 символами. Правильно? –

+0

Если пользователь вводит более 8 символов, остаток будет оставлен в stdin, да. Но я думаю, что вы вводите в заблуждение EOF с enter. – teppic

ответ

0

Что-то, как это будет работать, если вы хотите, чтобы на 8 символов и EOF, а также новой строки:

char buf[10]; 
fgets(buf, 10, stdin); 

int len=strlen(buf); 
if (buf[len-1] == '\n') buf[len-1] = '\0'; 
if (strlen(buf) == 8) 
    puts("Correct length"); 
else 
    puts("Incorrect length"); 

(fgets не тестировалась для успеха в этом примере)

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