strchr() 在看似 none 的地方找到 '\n'

strchr() finding '\n' where there seemingly is none

我正在使用一个名为 s_gets() 的修改后的 fgets() 函数,该函数从输入中删除换行符或丢弃输入缓冲区中的任何剩余字符。看起来像下面这样;

char *s_gets(char *str, int n, FILE *pf) {

    char *ret_val;
    char *find;

    ret_val = fgets(str, n, pf);
    if (ret_val) {
        find = strchr(str, '\n');
        if (find) {
            puts("Newline was found.");
            printf("Character before \n is %c\n", *(find - 1));
            *find = '[=11=]';
        } else {
            while (getchar() != '\n')
                continue;
        }
    }
    return ret_val;
}

当我使用这个函数并将它 FILE* 传递给一个在一行中只包含字符串 apple 的文件时,if 子句中的 puts() 运行并且 printf() 语句打印 Character before \n is e。我的问题是这个神秘的换行符是从哪里来的?这与 EOF 有什么关系吗?我正在 macOS 10.14 上使用 Apple LLVM 版本 10.0.0 (clang-1000.10.44.2) 进行编译。

即使字符串 "apple" 写在一行中,编辑器(例如 gedit)自动 将换行符添加到该行的末尾).这就是你看到它的原因。


PS:如 rici 所述:Why should text files end with a newline?