C中的无符号字符陷阱

时间:2013-12-31 02:34:34

标签: c internationalization eof unsigned-char

大多数C编译器都使用带符号的字符。大多数C库将EOF定义为-1。

尽管我是一名长期的C程序员,但我从未将这两个事实放在一起,所以为了强大的国际软件的利益,我会请求一些帮助来说明其含义。

这是我到目前为止所发现的:

  • fgetc()和朋友在返回int之前转换为无符号字符,以避免与EOF冲突。
  • 因此需要注意结果,例如: getchar() == (unsigned char) 'µ'
  • 从理论上讲,我相信基本字符集都不会保证是正面的。
  • <ctype.h>函数旨在处理EOF和预期的无符号字符。任何其他负面输入都可能导致越界寻址。
  • 大多数将字符参数作为整数的函数忽略EOF,并且可以互换地接受有符号或无符号字符。
  • 字符串比较(strcmp / strncmp / memcmp)比较无符号字符串。
  • 在sizeof(int)= 1的系统上,可能无法区分EOF与正确的字符。
  • 宽字符函数不用于二进制I / O,因此WEOF在wchar_t范围内定义。

这个评估是否正确?如果是这样我错过了其他的问题?

完全披露:我今天遇到了一个越​​界索引错误,当时将非ASCII字符输入到isspace()中,并且在我的旧代码中实现了潜伏的错误数量,这些都让我感到害怕和烦恼。因此这个令人沮丧的问题。

1 个答案:

答案 0 :(得分:2)

基本执行字符集保证是非负的 - C99中的准确措辞是:

  

如果基本执行字符集的成员存储在char中   对象,它的值保证是非负的。