我正在学习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;但是,当我做同样的事情时,它只打印一个换行符。
我无法承受足够的压力,这段代码完全与书中相同,但它的行为却不同。有人能看出原因吗?
答案 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指向的数组。没有其他字符 在新行字符(保留)之后或之后阅读 档案结尾。在最后一个字符后面立即写入空字符 字符读入数组。