fgets and dealing with CTRL+D input

15,869

On Linux, Ctrl + D generates EOF, so you need to check the return value of fgets() every time. When EOF is encountered, fgets() returns a null pointer

if (fgets(buff, 10, stdin) == NULL)
    print_error();
Share:
15,869
Talen Kylon
Author by

Talen Kylon

Updated on June 30, 2022

Comments

  • Talen Kylon
    Talen Kylon almost 2 years

    I am grabbing some standard input from the user and if the user presses CTRL+D, I want to display an error and terminate the program. I think perhaps my issue may be related to being stuck in a while loop;

    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;
    

    I don't understand why at the first input if the user presses CTRL+D, the program responds accordingly but the second time it completely ignores it.