strstr 没有返回想要的结果

时间:2021-04-21 17:42:35

标签: c strstr

你能找出这段代码中的错误吗,即使我传递了有效的参数来查找,也无法打印歌曲

#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 askedSong[80];
    printf("%s", "Hey buddy, what is the good one today? ");
    fgets(askedSong, sizeof(askedSong), stdin);
    find_track(askedSong);
    return 0;
}

4 个答案:

答案 0 :(得分:2)

  1. 假设你可以在 fgets 之后得到“\n”。需要修剪它(如果您从键盘输入)。您可以尝试使用文件输入运行: yourexefile.exe < input.txt > output.txt 并发现它以某种方式起作用
  2. 假设您在循环中找到结果后应该中断。

答案 1 :(得分:1)

这里的问题是 fgets'\n' 中包含尾随换行符 askedSong

这是我找到它的方式--- 我在调试器中运行该程序并在 find_track() 中放置了一个断点。然后当提示我在命令行上输入“girl”时,看到函数的参数是“girl\n”。

这是我在调试器中看到的:

Hey buddy, what is the good one today? girl

Breakpoint 1, find_track (search_for=0x7fffffffd9c0 "girl\n") at test.c:15
15      for(i = 0; i < 5; i++) {
(gdb) 

在 C 中有很多古怪的方法来修剪“\n”:Removing trailing newline character from fgets() input

答案 2 :(得分:1)

fgets extra \n 的问题(输入)

#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)!=NULL) {
            printf("Track %i: '%s'\n", i, tracks[i]);
        }
    }
}

int main() {
    char askedSong[80];
    printf("%s", "Hey buddy, what is the good one today? ");
    scanf("%s",askedSong);// try to use scanf to ovoid \n in the buffer
    find_track(askedSong);
    return 0;
}

答案 3 :(得分:1)

fgets 在字符串中留下换行符。轻松修复:

fgets(askedSong, sizeof(askedSong), stdin);
askedSong[strcspn(askedSong, "\n")] = 0;