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();
Author by
Talen Kylon
Updated on June 30, 2022Comments
-
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.