Search code examples
cstringfgets

fgets() includes the newline at the end


fgets(input,sizeof(input),stdin);
if (strcmp(input, "quit") == 0){
  exit(-1);
}

If I type quit, it does not exit the program; I'm wondering why this is the case.

By the way input is declared as char *input;.


Solution

  • Trailing newline in your input. See man fgets. Test for "quit" + newline, for example:

    fgets(input,sizeof(input),stdin);
    if(strcmp(input, "quit\n") == 0){
        exit(-1);
    }
    

    I completely missed the last sentence, re char *input. Depending on the architecture, input will be 4 or 8 bytes long. So the code is effectively

    fgets(input, 8, stdin);
    

    which doesn't reflect the real size of memory, input points to. This might "work" as long as the input is shorter than eight bytes, but will truncate the input, if it is larger. Furthermore, you will get the rest of the input the next time you call fgets.

    You should either give the real size or take @JonathanLeffler's advice and declare a char array instead, e.g.

    char input[64];
    fgets(input, sizeof(input), stdin);
    

    or

    char *input = malloc(N);
    fgets(input, N, stdin);