2013-10-07 3 views
3

Я захватываю некоторый стандартный ввод от пользователя, и если пользователь нажимает CTRL + D, я хочу отобразить сообщение об ошибке и завершить работу программы. Я думаю, возможно, моя проблема может быть связана с тем, что вы застряли в цикле while;fgets и работа с CTRL + D input

int readInput(){ 
    char buff[10]; 
    int count = 0; 
    int counter; 
    printf("Enter random number: "); 
    fgets(buff, 10, stdin); 
    if ((int) strtol(buff, NULL, 10) == 0){ 
     printf("Error reading number. \n"); 
     return 0; //This will get hit if the user presses CTRL+D at this input. 
    } 
    counter = atol(buff); 
    while (count < counter){ 
     printf("Enter a label: "); 
     fgets(buff, 10, stdin); 
     if ((int) strtol(buff, NULL, 10) == 0){ 
     printf("Error reading label"); 
     return 0; //This will not get hit if the user presses CTRL+D at this input, but why? 
     //I've also tried assigning a variable to 0, breaking out of the loop using break; and returning the variable at the end of the function but that also does not work. 

     //the rest of the while loop continues even if user hit CTRL+D 
     printf("Enter Value: "); 
     fgets(buff, 10, stdin); 
     //..rest of while loop just gets other inputs like above 
     count++; 
    } 

//termination happens in main, if readInput returns a 0 we call RETURN EXIT_FAILURE; 

Я не понимаю, почему на первом входе, если пользователь нажимает CTRL + D, программа реагирует соответствующим образом, но второй раз она полностью игнорирует его.

+0

Способ счетчик приращение в цикле, пока любопытный. Кроме того, подсчитывается ли когда-либо увеличение? – ryyker

+0

Является ли ОС Linux? –

+0

Это на машине ubuntu, да. Счет –

ответ

7

В Linux Ctrl + D генерирует EOF, так что вам нужно, чтобы проверить возвращаемое значение fgets() каждый раз. Когда EOF встречаются, fgets() возвращает пустой указатель

if (fgets(buff, 10, stdin) == NULL) 
    print_error(); 
+0

Понял, любая идея относительно того, почему первая проверка для CTRL + D работала правильно? –

+0

, потому что D автоматически инициализирует буферы до '\ 0' (в режиме отладки, по крайней мере), а во втором тесте у вас все еще было старое значение в' buff' –

+1

@YuHao фактически любой символ без цифры в первом месте баффа даст strtol return 0, так что это 10 из 256 вероятность того, что он не работает –