如何使用gets()读取无符号字符数组?

时间:2011-05-28 07:33:09

标签: c

我需要从输入中读取一些无符号字符(ASCII值> 127)。 我用过 -

unsigned char S[102];

但是当我接受这样的输入时 -

 gets(S);

编译器显示错误:

  

错误:转换无效   'unsigned char *'到'char *'

所以我的问题是如何使用gets()或任何其他函数读取无符号字符数组。

2 个答案:

答案 0 :(得分:2)

首先,你永远不应该使用gets。在任何情况下都不能安全使用。我的评论可能对幽默效果有点夸张,但重点仍然存在。

您应该使用的功能代替gets fgetsfgets使用FILE *指针(但您可能只想传递stdin)和最大长度,因此它知道不会溢出缓冲区。与gets不同,fgets不能保证在整行中读取 - 该行可能太大而无法容纳缓冲区。但是,您可以轻松地从中恢复并编写代码以便以各种方式正确处理输入(而使用gets,您只需要希望缓冲区足够长,如果不是,那么谁知道什么会发生。)

我有点不清楚您打算阅读哪种数据。如果是文本,fgets可能就是您要找的内容。它仍然需要char *,因此为了完成这项工作,您需要在将S传递给函数时将char *投射到fread。通常,强制转换是一件坏事,特别是从有符号转换为无符号类型,但在这种情况下,(可能)不会发生任何坏事。

如果您实际上正在将二进制数据读入无符号数组,则应该查看fgets。与void *不同,它需要fread来容纳您需要阅读的任何类型的数据,因此不需要强制转换。请注意{{1}}读取块而不是行,所以如果您想要文本输入,您应该查看其他地方 - 它不会尝试读取整行,也不会在看到一行时停止读取缓冲区结束。

答案 1 :(得分:1)

您可以使用以下gets代替:

  • fgets (s, MAX_BUFFER, stdin);
  • scanf ("%[^\n]%*c", s);

当使用值大于127的ASCII字符时,两者都有效:.±┼┤.␤▒⎽␤ .␍≤┼⎽≤└ .␍≤┼⎽├⎼ .±┼┤.┴␊⎼⎽␋⎺┼ .±┼┤.┴␊⎼⎽␋

gets也会做这件事。您无需将数组作为unsigned char *传递。