C strstr未返回所需结果

C strstr未返回所需结果,c,strstr,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&qu

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

#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;
}
#包括
#包括
字符轨道[][80]={
“我把我的心留在哈佛医学院”,
“纽瓦克,纽瓦克-一个美妙的小镇”,
“和傻瓜跳舞”,
“从这里到产妇”,
“硫磺岛的女孩”,
};
void find_track(char search_for[])
{
int i;
对于(i=0;i<5;i++){
if(strstr(轨道[i],搜索){
printf(“磁道%i:'%s'\n',i,磁道[i]);
}
}
}
int main(){
char askedSong[80];
printf(“%s”,“嘿,伙计,今天有什么好的?”;
fgets(askedSong、sizeof(askedSong)、stdin);
查找_轨道(askedSong);
返回0;
}
  • 假设您可以在fgets之后的末尾获得“\n”。需要修剪它(如果您是从键盘输入)。您可以尝试使用文件输入运行: yourexefile.exeoutput.txt 然后发现它在某种程度上是有效的
  • 假设在循环中找到结果后应该中断

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

    我是这样发现的--- 我在调试器中运行了该程序,并在
    find\u 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) 
    
    嘿,伙计,今天的好节目是什么?女孩
    断点1,在测试中查找跟踪(搜索=0x7fffffffd9c0“女孩”\n)。c:15
    15表示(i=0;i<5;i++){
    (gdb)
    

    有很多奇怪的方法来修剪C中的“\n”:

    fgets extra的问题(回车)

    #包括
    #包括
    字符轨道[][80]={
    “我把我的心留在哈佛医学院”,
    “纽瓦克,纽瓦克-一个美妙的小镇”,
    “和傻瓜跳舞”,
    “从这里到产妇”,
    “硫磺岛的女孩”,
    };
    void find_track(char search_for[])
    {
    int i;
    对于(i=0;i<5;i++){
    if(strstr(磁道[i],搜索)!=NULL){
    printf(“磁道%i:'%s'\n',i,磁道[i]);
    }
    }
    }
    int main(){
    char askedSong[80];
    printf(“%s”,“嘿,伙计,今天有什么好的?”;
    scanf(“%s”,askedSong);//尝试使用scanf在缓冲区中创建ovoid\n
    查找_轨道(askedSong);
    返回0;
    }
    
    fgets
    在字符串中保留换行符。轻松修复:

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

    请注意,fgets()将换行符视为有效字符并将其加载到字符串中。多谢老兄,该建议帮助了我!我根本不知道fgets在末尾插入新行字符的事情。问题是scanf不允许使用空格字符串,而且它在处理大小方面也有问题。在我的情况下,我认为这不是最好的oOption.抱歉响应太晚。但仅为提供信息,您可以允许使用空格字符串。您还可以定义字符串的大小示例。`scanf(“%80[^\n]”,askedSong);`.plz(如果您现在不尝试它)。这非常有帮助。
    fgets(askedSong, sizeof(askedSong), stdin);
    askedSong[strcspn(askedSong, "\n")] = 0;