我需要从输入中读取一些无符号字符(ASCII值> 127)。 我用过 -
unsigned char S[102];
但是当我接受这样的输入时 -
gets(S);
编译器显示错误:
错误:转换无效 'unsigned char *'到'char *'
所以我的问题是如何使用gets()或任何其他函数读取无符号字符数组。
答案 0 :(得分:2)
首先,你永远不应该使用gets
。在任何情况下都不能安全使用。我的评论可能对幽默效果有点夸张,但重点仍然存在。
您应该使用的功能代替gets
fgets
。 fgets
使用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 *
传递。