Search code examples
cstringinputfgetsstrcmp

strcmp on a line read with fgets


I'm trying to compare two strings. One stored in a file, the other retrieved from the user (stdin).

Here is a sample program:

int main()
{
    char targetName[50];
    fgets(targetName,50,stdin);

    char aName[] = "bob";
    printf("%d",strcmp(aName,targetName));

    return 0;
}

In this program, strcmp returns a value of -1 when the input is "bob". Why is this? I thought they should be equal. How can I get it so that they are?


Solution

  • strcmp is one of the few functions that has the reverse results of true and false...if the strings are equal, the result is 0, not 1 as you would think....

    if (strcmp(a, b)) {
        /* Do something here as the strings are not equal */
    } else {
        /* Strings are equal */
    }
    

    Speaking of fgets, there is a likelihood that there is a newline attached to the end of the string...you need to get rid of it...

    +-+-+-+--+--+
    |b|o|b|\n|\0|
    +-+-+-+--+--+
    

    To get rid of the newline do this. CAVEATS: Do not use "strlen(aName) - 1", because a line returned by fgets may start with the NUL character - thus the index into the buffer becomes -1:

    aName[strcspn(aName, "\n")] = '\0';
    
    +-+-+-+--+
    |b|o|b|\0|
    +-+-+-+--+
    

    Now, strcmp should return 0...