字符串示例不按预期运行

时间:2015-03-03 19:10:32

标签: 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;
}

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

我无法承受足够的压力,这段代码完全与书中相同,但它的行为却不同。有人能看出原因吗?

1 个答案:

答案 0 :(得分:7)

问题在于本声明

fgets(search_for, 80, stdin);

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

size_t n = strlen( search_for );

if ( n != 0 && search_for[n-1] == '\n' ) search_for[n-1] = '\0';

来自C标准

说明

  

2 fgets函数最多只读取一个   由指向的流中的n指定的字符数   流入s指向的数组。没有其他字符   在新行字符(保留)之后或之后阅读   档案结尾。在最后一个字符后面立即写入空字符   字符读入数组。