【发布时间】:2011-10-31 03:44:00
【问题描述】:
C 编程语言说来自<ctype.h> 的函数遵循一个共同的要求:
ISO C99,7.4p1:
在所有情况下,参数都是
int,其值应表示为unsigned char,或应等于宏EOF的值。如果参数有任何其他值,则行为未定义。
这意味着下面的代码是不安全的:
int upper(const char *s, size_t index) {
return toupper(s[index]);
}
如果此代码在char 具有与signed char 相同的值空间并且字符串中存在具有负值的字符的实现上执行,则此代码将调用未定义的行为。正确的版本是:
int upper(const char *s, size_t index) {
return toupper((unsigned char) s[index]);
}
尽管如此,我看到许多 C++ 示例并不关心这种未定义行为的可能性。那么C++标准中有什么东西可以保证上面的代码不会导致未定义的行为,还是说所有的例子都是错的?
[附加关键字:ctype cctype isalnum isalpha isblank iscntrl isdigit isgraph islowwer isprint ispunct isspace isupper isxdigit tolower]
【问题讨论】:
-
你问的是 C++ 但引用了 C99 吗?
-
哦,C++98 早于 C99。尽管如此,C90 的文本几乎相同,C++98 从 C90 借用其标准库,所以是的,我故意引用 C 标准。
-
char 的符号是编译器特定的。尽管我对此表示怀疑,但也许其中一些“错误”的示例项目会迫使编译器将 char 视为无符号。
-
@cnicutar C++98 标准包含有关
的详细信息。遵循 C++ 标准完全删除了该部分,而是在 [cctype.syn] 中明确声明应参考 ISO C 第 7.4 节的定义,其中 ISO C 是撰写本文时的最新 C 标准(即所有情况下的 C99)。因此,根据过去 20 年的所有 C++ 标准,OP 中的引用是正确的(也是唯一的)引用。这也是 10 年前发布 OP 时的情况。 :)
标签: c++ c character undefined-behavior language-lawyer