fgets和非可打印字符

3

能否用fgets将非可打印字符读入给定的char*中(似乎不行)?如果不能,请问有什么替代方法可以从流中将最大数量的输入字符读入char*中?

编辑 (针对我的具体情况)

我有一个编码器,它在stdout上打印“Le\D7”,然后通过管道传输到解码器,解码器使用以下代码从其stdin中获取:

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具有相同的结果。

你可以使用fread函数,网址为http://www.cplusplus.com/reference/cstdio/fread/。 - Oki Sallata
ASCII值198无法通过。读取的字符具有巨大的整数值。 - vlad417
我的意思是,当我执行((unsigned int) someChar)时,那就是我得到的值。 - vlad417
@vlad417,有什么问题吗?如果你从FILE *中将值198读入到someChar中,那么你实际上已经_读取_了该字符。 - Aniket Inge
强制类型转换可能会有帮助。 - Oki Sallata
显示剩余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
(unsigned) x = 4294967238
(unsigned char) x = 198

(unsigned char) 转换是您想要的。

请忽略我的代码中的有符号溢出。请注意,如果使用GCC编译并使用-funsigned-char 标志,则输出为:

x = 198
(unsigned) x = 198
(unsigned char) x = 198

谢谢,就是这样。我在fgets之后遍历char*并将其全部转换为unsigned chars。我想也可以将fgetc转换。 - vlad417
1
@vlad417:fgetc()不需要强制转换,因为它在内部使用(unsigned char)转换。 - Dietrich Epp

1

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

但有许多替代方案,其中之一是fread()fscanf()

fgetc()和其他函数将可打印和不可打印的字符都读入char数组中。 char只是一个以ASCII编码的1字节数字(或者在wchar_t的情况下为2字节)。在C语言中不存在“可打印”和“不可打印”的概念。


我认为有一些可打印和不可打印字符的概念,因为在 <ctype.h> 中有一个 isprint 函数。 - templatetypedef
一些想法是为了人类读者而不是机器阅读 :-) @templatetypedef - Aniket Inge
在 C 语言中有可打印和不可打印字符的概念。C 标准规定了一个名为 isprint() 的宏或函数,用于判断字符是否可打印,对于不可打印字符返回 false。该函数在 <ctype.h> 头文件中可用。 - Dietrich Epp
那么,@DietrichEpp,fgetc()函数读取不可打印字符的方式是否与它读取可打印字符的方式不同? - Aniket Inge
不,但答案说“在C语言中没有可打印和不可打印字符的概念”,这是不正确的。 - Dietrich Epp

0

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

或者你可以使用无符号字符指针unsigned char*来处理不可打印的ASCII字符。

所以在我看来,是的,fgets()函数可以读取不可打印的ASCII字符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接