c - 书错? (头先 C)

标签 c fgets

在《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/

相关文章:

c - 如何在 C 中读取字符数组并通过错误检查将其转换为整数?

c - fgets() 之后 buf 的左边部分是什么?

c - 我的 sscanf 如果陷入无限循环,我该如何修复它

c - 如何在 Makefile 中正确引用 GNU Readline 库?

c++ - 如何在 C 或 C++ 的 O(n) 中删除数组中的重复元素?

代码不适用于长回文

c - 在 C 宏中使用和返回输出

C 标准输入输出 ()

c - 使用 fgets() 从不同的管道读取,从两者读取相同的消息(应该不同)

c - 如何让 opencv 包含在 kubuntu 中工作? (包括如何在 netbeans 6.7.1 中包含和链接的解决方案)