在《Head First C》第一版中,有这样一个程序:
#include <stdio.h>
#include <string.h>
char tracks[][80] = {
"I left my hearth 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;
}
但是,在编译和测试时,您没有得到预期的结果。有点头疼之后,我决定查找 fgets 的文档,我发现该函数读取到一个包含换行符的字符,这就是为什么无论我搜索什么,我都得不到预期的结果。但是,在书中他们说该程序在测试时有效。这是书上的错误,还是我遗漏了什么?
附言。可以使用 scanf 轻松修复该错误,一旦您知道该程序为何无法按预期运行,这一点就会变得显而易见。
PS2。我记得 C++ 有一些语法可以忽略换行符。 C有类似的东西吗?
最佳答案
我也遇到了这个错误,不过最新版本已经修正了错误。事实上,函数 'char *fgets(char *s, int size, FILE *stream)
就像你说的那样工作。它最多只能读取 size-1
。如果遇到 null 字符 ('\0'),它只会将 ('\0') 添加到缓冲区。所以当我们使用函数find_track()
时,我们什么也得不到,因为search_for
已经包含了('\0')。有一些解决方案可以处理它。
scanf("%79s", search_for)
。注意,不要只使用%s
,因为你会遇到和fgets()
一样的情况。scanf("%79[^\n]", search_for)
,和前者有些区别。优点是可以避免空白问题。
PS:第一个,你可以添加一个新的功能来避免空白问题。像这样:
void remove_tail_newline(search_for)
{ size_t len = strlen(str);
if(len > 0 &&str[len-1] =='\n') str[len -1] ='\0';
}
关于c - 书错? (头先 C),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36048488/