在下面的代码中,isspace
表示空字符不是空格。在后面的代码中,fwrite
函数将包含中间空字符和最后空字符的字符序列写入文件。
C17标准指出s
转换说明符“匹配非空白字符序列”。然而,代码末尾的fscanf
只匹配第一个空字符,但不包括第一个空字符。
标准中有什么东西可以证明这种看似矛盾的行为是合理的吗?除了isspace
指示的字节之外,是否还有其他字节被视为空白?如果有,它们是什么?我在写入文件的内容中放入了\26
和其他一些控制字符,fscanf
可以很好地读取它们。
#include <stdio.h>
#include <ctype.h>
int main(void)
{
int x = isspace('\0');
char inBuf[40];
char outBuf[] = "Hello\0world\n";
FILE *fp = fopen("MyFile.txt", "w+b");
fwrite(outBuf, 1, sizeof(outBuf), fp);
fflush(fp);
rewind(fp);
fscanf(fp, "%s", inBuf);
}
2条答案
按热度按时间pu82cl6c1#
但是,代码末尾的
fscanf
只匹配第一个空字符,但不包括第一个空字符。这是不正确的,下面的程序的输出是“Hello”,然后是“world”。
fscanf
读取整行直到换行符;它不会在空字符处停止。vh0rcniy2#
代码末尾的fscanf只匹配但不包括第一个空字符。
这是不正确的。
正如你所看到的,它读到字符串的末尾,而不是在NUL处停止。
(You也可以在
fscanf
之后使用ftell
来获取读取的字节数。)你没有说明你是如何得出
fscanf
在NUL处停止的结论的,但我假设你使用了类似printf( "%s\n", inBuf );
的东西。That 在第一个NUL处停止。不是阅读。