简体   繁体   中英

C Code for String matching[Head First C] doesn't seem to work

#include <stdio.h>
#include <string.h>

char tracks[][80] = {
"I left my heart in Harvard Med School",
"Newark, Newark - a wonderful town",
"Dancing with a Dork",
"From here to maternity",
"The girl from Iwo Jima",
};

void find_track(char search_for[])
{
    int i;
    for (i = 0; i < 5; i++)
    {
        if (strstr(tracks[i], search_for))
        printf("Track %i: '%s'\n", i, tracks[i]);
    }

}
int main()
{
    char search_for[80];
    printf("Search for: ");
    fgets(search_for, 80, stdin);
    find_track(search_for);
    getch();
    return 0;

}

This is the code taken directly from Head First C. This doesn't work.On the other hand if I change the line in main

char search_for[80];

to

char *search_for = "town"

It gives me the expected result. I don't understand why it doesn't work.I understand that directly pasting the code and telling you to find errors is not very much acceptable here but i guess it is a very small piece of basic code so it will do.

Thanks

The problem with the code above is that it doesn't account for the fact that fgets leaves the newline in the string . So when you type town and hit enter , you'll end up searching for "town\\n" .

A cheap way to solve this would be to fix the string after calling fgets

search_for[strlen(search_for) - 1] = 0;

As already pointed out by @cnicutar, fgets leaves the newline char (code 10) in the string. You can find this out by yourself by iterating over the char array and printing the character codes and looking the special chars up in an ASCII code table (http://www.asciitable.com/):

int main()
{
    int i;
    char search_for[80];
    printf("Search for: ");
    fgets(search_for, 80, stdin);
    scanf("%79s", search_for);

    // print index, char code, char itself
    for (i=0;i<80;i++) {
        printf("%d: %d %c\n", i, search_for[i], search_for[i]);
    }
    find_track(search_for);
    getch();

    return 0;
}

The output will be:

...
0: 116 t
1: 111 o
2: 119 w
3: 110 n
4: 10
5: 0 
...

You can use the function "scanf" and limit the number of read chars to 79 (1 char reserve for NULL char at the end of the string as the buffer holds max 80 chars). See: http://www.cplusplus.com/reference/clibrary/cstdio/scanf/ for reference.

int main()
{
    char search_for[80];

    printf("Search for: ");
    scanf("%79s", search_for);

    find_track(search_for);

    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM