似乎无法在这里看到我的错误,当我编译并运行时,我只是得到了"搜索:"即将到来,我输入一些应该显示结果的东西,但没有任何反应,只是退出。
我已经从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;
}
答案 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查看其他人。