自动点唱机代码中的错误(首先是C)

时间:2014-01-23 20:06:34

标签: c

我正在使用Head First C书学习C编程。 所以我正在尝试编译我们可以在第94页找到的代码:

#include <stdio.h>
#include <string.h>

char tracks[][80] = {
    "I left my heart in Harvard Mead 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(void)
{
    char search_for[80];

    printf("Search for: ");
    fgets(search_for, 80, stdin);
    find_track(search_for);
    return 0;
}

看看这个输出:

-----------------------------------------------------------------
./jukebox                                                      --
Search for: town                                               --
kawaban9a-14H:~/Code/C/Head_C/Chapter_3$ (so, nothing happens) --
-----------------------------------------------------------------

没关系,没有编译器投诉,但是当我运行它时,没有结果。 我几次读了这段代码,我无法理解为什么,这里的bug是什么? 如果有人可以帮助我,我将不胜感激。

稍后的几分钟......

感谢朋友cnicutar的回答,帮助我找出'\n'的问题。 我通过在调用find_track()函数之前插入一段代码来解决这个问题。

检查出来:

int main(void)
{
    char search_for[80];

    printf("Search for: ");
    fgets(search_for, 80, stdin);

    size_t ln = strlen(search_for) - 1;
    if (search_for[ln] == '\n')
        search_for[ln] = '\0';

    find_track(search_for);
    return 0;
}

2 个答案:

答案 0 :(得分:4)

问题是fgets将换行符存储在目标字符串中。因此,strstr需要找到"town\n"。一种解决方案是在search_for之后修剪fgets以摆脱换行符。

答案 1 :(得分:1)

fgets替换为:

scanf("%79s", search_for);