3

fgets 可以将不可打印的字符读入给定的 char*(看来我不能)吗?如果不是,那么允许最大数量的输入字符从流到 char* 的替代方法是什么?

编辑(对于我的特殊情况)

我有一个将“Le\D7”打印到标准输出的编码器,该编码器通过管道传输到解码器,该解码器使用以下方法从其标准输入中获取该解码器:

if( fgets( inputChars, MAX_BYTES_IN, stdin ) == NULL )
{
    fprintf( stderr, "Trouble getting input\n" );
    return 0;
}

while( inputChars[crntChar] != '\0' && inputChars[crntChar] != '\n' )
{
    printf( "Value %d: %d\n", crntChar, inputChars[crntChar]);
    crntChar++;
}

这导致:

Value 0: 76
Value 1: 101
Value 2: -41

使用 fgetc 具有相同的结果

4

3 回答 3

1

由于无符号到有符号整数的转换,您得到了一个奇怪的值。

char x = 198;

printf("x = %d\n", x);
printf("(unsigned) x = %u\n", (unsigned) x);
printf("(unsigned char) x = %d\n", (unsigned char) x);

输出:

x = -58
(无符号)x = 4294967238
(无符号字符)x = 198

(unsigned char)演员阵容就是你想要的。

请忽略我的代码中的签名溢出。请注意,如果您使用 GCC 和-funsigned-char标志进行编译,则输出为:

x = 198
(无符号)x = 198
(无符号字符)x = 198
于 2013-02-08T03:37:18.353 回答
1

最简单的方法是使用fgetc(). fgets()内部依赖fgetc().

但是有很多选择,fread()作为其中之一。fscanf().

fgetc()和其他人将可打印和不可打印字符读取到char数组中。Achar只是一个以 ASCII 编码的 1 字节数字(或 2 字节wchar_t)。C中没有printablenon printable字符的概念。

于 2013-02-08T03:22:02.577 回答
0

fgets()将读取一行字符串,在这种情况下读取直到换行\n/0x0ANULL/ EOF

或者您可以将 unsigned char* 用于不可打印的 ASCII。

所以在我看来,是的,fgets()可以读取不可打印的 ASCII

于 2013-02-08T03:31:49.070 回答