无法枚举数组

时间:2013-08-03 13:45:03

标签: c arrays strstr

似乎无法在这里看到我的错误,当我编译并运行时,我只是得到了"搜索:"即将到来,我输入一些应该显示结果的东西,但没有任何反应,只是退出。

我已经从Head First C书中完全重新创建了这段代码(我可以看到!),但它的工作方式不同,他们在搜索时会显示结果。

所以打击了我们,我做错了什么?提前致谢!!

顺便说一句,数组+数组指针在lol中做我的头。

以下是代码:

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

3 个答案:

答案 0 :(得分:4)

fgets函数,如所述here,包含新行(\n)字符,因为它被视为有效字符:

  

换行符使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。

这意味着您要检查,例如:

"I left my heart in Harvard Med School"

"I left\n"

所以匹配不会发生。您可以尝试使用gets或将\n字符替换为NUL(\0):

char search_for[80];
fgets(search_for, 80, stdin);
search_for[strlen(search_for)-1] = '\0';

答案 1 :(得分:1)

fgets手册页中:“读取在EOF或换行符后停止。如果读取换行符,则将其存储到缓冲区中。终止后存储终止空字节('\ 0')缓冲区中的字符。“

因此,在您的代码中,按下最后的“回车”后,search_for中存储的值实际上是“what_you_type”+“\n”。但tracks不包含任何“\n”,因此找不到您输入的内容并不奇怪。

tracks更改为:

 char tracks[][80] = 
 {
    "I left my heart in Harvard Med School\n",
    "Newark, Newark - A wonderful town\n",
    "Dancing with a Dork\n",
    "From here to maternity\n",
    "The girl from Iwo Jima\n",
};

并输入整个句子或类似“Iwo Jima”的内容,您一定会找到您要找的内容。

答案 2 :(得分:1)

杰克的回答没问题。

您可以替换

  

fgets(search_for,80,stdin);

通过

  

scanf(“%79s”,search_for);

这是本书的错误。您可以在Errata for Head First C查看其他人。