【问题标题】:fgets and non-printable charactersfgets 和不可打印字符
【发布时间】:2013-02-08 03:10:39
【问题描述】:

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 也一样

【问题讨论】:

  • 哪些字符似乎无法读取?
  • 你可以使用 fread cplusplus.com/reference/cstdio/fread
  • ASCII 值 198 未通过。读取的字符有一个巨大的整数值
  • 没有 ASCII 198 这样的东西。显示你的代码。也许我们可以发现那里有一个有符号->无符号转换。
  • 如果 ascii 198 以 char 表示,而不是 intshort 甚至 unsigned char,则会出现有符号->无符号转换

标签: c io


【解决方案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

【讨论】:

  • 谢谢,就是这样。我在 fgets 之后通过 char* 并将其全部转换为无符号字符。我想也可以施放 fgetc。
  • @vlad417: fgetc() 不需要转换,因为它在内部使用(unsigned char) 转换。
【解决方案2】:

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

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

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

【讨论】:

  • 我认为有一些关于可打印字符与不可打印字符的想法,因为<ctype.h> 中有一个isprint 函数。
  • some 的想法是为人类读者而不是机器阅读 :-) @templatetypedef
  • C 中有可打印/不可打印字符的概念。C 标准指定了一个宏或函数isprint(),对于可打印字符返回true,对于不可打印字符返回false。它在<ctype.h> 标头中可用。
  • 那么,@DietrichEpp fgetc() 读取不可打印字符的方式与读取可打印字符的方式不同吗?
  • 不,但答案是“C 中没有可打印和不可打印字符的概念”,这是不正确的。
【解决方案3】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 2012-11-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多