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?
我正在使用一个名为 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?