0

我正在编写 C 编程书中的这个示例,并且 strstr 命令应该在值为 true 时触发 printf 命令。它试图在曲目中找到一个字符串并返回它是在哪个曲目中找到的。我已经为此玩了一个多小时,似乎无法找到问题所在。目前,即使应该有匹配,它也不会打印任何东西。

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

char tracks[][80] = {
        "Boston",
        "Where the Streets Have No Name",
        "Row Row Row your Boat",
        "Gangsta Paradise",
        "Yoda",
    };


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

    }
}

int main(){

    char searchFor[80];
    printf("what is your string?: ");
    fgets(searchFor, 80, stdin);
    printf("searching for: %s", searchFor);
    findTrack(searchFor);

    return 0;
}
4

3 回答 3

3

我建议您将输入的搜索字符串打印出来——您可能会发现行尾有一个换行符。您应该在要搜索的字符串中包含换行符,或者将其从输入中删除。

您可以按如下方式执行此操作:

char *p = strchr(searchFor, '\n');
if (p!=NULL) *p='\0';

此外,我建议您应该编写“干净”代码

if(strstr(tracks[i], searchFor)!=NULL) {

这清楚地表明您了解strstr返回指针。

于 2014-07-19T02:00:13.910 回答
1

补充@floris 答案...

将指针转换为布尔值的一个巧妙技巧是对指针 (!!pointer) 进行双重否定,如下所示:

if(!!strstr(tracks[i], searchFor))
    printf("Track %i: '%s'\n", i, tracks[i]);
于 2020-05-10T14:19:25.777 回答
0

这是因为fgets()会在输入中添加一个换行符。所以 SerchFor 输入会变成"SearchFor\n"(输入)。要进行比较,您必须删除换行符。

这是代码:

int len = strlen(buffer);

if(buffer[len-1]=='\n')
   buffer[len-1]='\0'; 

您可以在fgets().

于 2020-10-17T17:21:07.647 回答