字符串示例的行为与预期不符

use*_*736 5 c

我正在学习C,而且我一直在关注"Head First C"一书.我到达了一个示例,其中这是生成的代码:

#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);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我检查了双倍,三倍和四倍.此代码与本书中的示例完全相同.起初我把它做成了我自己,所以我不仅仅是在没有学习的情况下进行复制,但是当我不工作时,我确实将其复制以确保.代码请求字符串,然后打印包含您给它的字符串的任何轨道.在本书中,当运行示例代码时,给出的字符串是"town",代码打印出"Newark,Newark - 一个美妙的城镇".但是,当我做同样的事情时,它只打印一个换行符.

我不能强调,这段代码与书中的完全相同,但它的行为却不同.有人能看出原因吗?

Vla*_*cow 7

问题出在本声明中

fgets(search_for, 80, stdin);
Run Code Online (Sandbox Code Playgroud)

函数fgets在字符串中包含新行字符.你必须从字符串中删除它.例如

size_t n = strlen( search_for );

if ( n != 0 && search_for[n-1] == '\n' ) search_for[n-1] = '\0';
Run Code Online (Sandbox Code Playgroud)

来自C标准

描述

2 fgets函数最多可读取一个小于n指定的字符数,该数字由stream指向的流指向s指向的数组.在换行符(保留)或文件结束后不会读取其他字符.在读入数组的最后一个字符后立即写入空字符.