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;
}

解决方法

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

这里的问题是 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

,

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;
}
,

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

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