如何正确使用wctype.h函数?

时间:2012-05-06 05:15:45

标签: c language-lawyer ctype

is...中的各种isalpha函数(例如isdigitctype.h)并非完全可预测。他们采用int个参数但期望unsigned char范围内的字符值,因此在char已签名的平台上,直接传递char值可能会导致不合适的符号扩展。我认为处理此问题的典型方法是先显式转换为unsigned char

好的,但在isw...中处理各种wctype.h函数的正确,可移植的方法是什么?与wchar_t一样,char也可以是已签名或未签名,但由于wchar_t本身是typedef,因此unsigned wchar_t的类型名称是非法的。

2 个答案:

答案 0 :(得分:2)

这不是wint_t的用途吗? iswXxxxx()函数采用wint_t类型:

ISO 9899:1999在各个部分涵盖了这一点,向后工作:

  

§7.25宽字符分类和映射实用程序<wctype.h>

     

§7.25.2.1.1iswalnum函数

     

概要

#include <wctype.h>
int iswalnum(wint_t wc);
     

描述

     

iswalnum函数测试iswalpha或iswdigit为真的任何宽字符。

     

§7.24扩展的多字节和宽字符实用程序<wchar.h>

     

§7.24.1简介:

wint_t
     

这是一个整数类型,默认情况下,参数升级不变,可以保存任何   对应于扩展字符集成员的值,以及至少一个   与扩展字符集的任何成员不对应的值(请参阅WEOF   下文); 269)

     

269) wchar_twint_t可以是相同的整数类型。

'默认参数促销未更改'应该意味着它必须与int一样大,但如果short可能是unsigned shortsizeof(short) == sizeof(int) (现在很少出现这种情况,但对于某些16位系统来说确实如此)。

  

§7.17通用定义<stddef.h>

wchar_t
     

是一个整数类型,其值范围可以表示所有的不同代码   受支持的语言环境中指定的最大扩展字符集的成员;该   null字符应具有代码值零和基本字符集的每个成员   当用作整数中的单个字符时,其代码值应等于其值   字符常量。

只要传递给iswalnum()或其亲属的值是有效的wchar_t或WEOF,该函数就能正常工作。如果你凭空创造了价值并设法使价值变得错误,那么就会产生不确定的行为。

答案 1 :(得分:1)

啊哈。在重新阅读关于wctype.h的ISO C99规范时,它声明:

  

对于本子条款中描述的接受类型为wint_t的参数的所有函数,该值应表示为wchar_t或等于宏WEOF的值。如果此参数具有任何其他值,则行为未定义。 (§7.25.1,bullet 5)

将其与ctype.h

的相应注释进行对比
  

在所有情况下,参数都是int,其值应为。{1}}   可表示为 unsigned char 或等于宏EOF的值。如果   参数有任何其他值,行为未定义。 (§7.4,bullet 1)

(强调我的)

因此wctype.h函数没有任何无符号的废话,我应该能够直接将wchar_t值传递给它们。