空字符是C中的空格吗?

gmol1639  于 2023-03-22  发布在  其他
关注(0)|答案(2)|浏览(128)

在下面的代码中,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);
}
pu82cl6c

pu82cl6c1#

但是,代码末尾的fscanf只匹配第一个空字符,但不包括第一个空字符。
这是不正确的,下面的程序的输出是“Hello”,然后是“world”。fscanf读取整行直到换行符;它不会在空字符处停止。

#include <string.h>
#include <stdio.h>
#include <ctype.h>

int main(void)
{
    char inBuf[40] = {0};
    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);
    printf("\"%s\", then \"%s\".\n", inBuf, inBuf + strlen(inBuf) + 1);
}
vh0rcniy

vh0rcniy2#

代码末尾的fscanf只匹配但不包括第一个空字符。
这是不正确的。

#include <stdio.h>

int main( void ) {
   char sp[]  = "abc def\n";
   char nul[] = "abc\0def\n";

   char buf1[10];
   char buf2[10];

   printf( "%d\n", sscanf( sp,  "%s %s", buf1, buf2 ) );
   printf( "%d\n", sscanf( nul, "%s %s", buf1, buf2 ) );
}
2   // First `%s` stopped at space, leaving characters for second %s.
1   // First `%s` stopped at LF, leaving nothing for second %s.

正如你所看到的,它读到字符串的末尾,而不是在NUL处停止。
(You也可以在fscanf之后使用ftell来获取读取的字节数。)
你没有说明你是如何得出fscanf在NUL处停止的结论的,但我假设你使用了类似printf( "%s\n", inBuf );的东西。That 在第一个NUL处停止。不是阅读。

相关问题