我正在使用isspace
来迭代字符串并标识空白字符:
const char* s = "abcd efg";
const char* ptr = s;
for (; *ptr != '\0'; ptr++)
printf("%c: %s\n", *ptr, isspace(*ptr) ? "yes" : "no");
如您所知,isspace
使用int
,而不是char
。上面的方法似乎可行-但我想验证它是否便携式,还是“偶然地工作”。
将char
转换为int
以与isspace
一起使用的理想方式是什么?
答案 0 :(得分:2)
您应该使用unsigned char
来管理字符。例如,fgetc
返回“转换为unsigned char
的字符作为int
”(C 2018 7.21.7.1)。使用char
会导致负值和不确定的行为,如下所述。
7.4 1仅针对其值可表示为<ctype.h>
或unsigned char
的参数定义EOF
函数的行为:
在所有情况下,参数均为
int
,其值应表示为unsigned char
或等于宏EOF
的值。如果该参数具有任何其他值,则行为是不确定的。
因此,如果您的char
带有负值,并且将其传递给<ctype.h>
函数之一,则该值不能表示为unsigned char
。而且通常也不是EOF
。 char
负值将通过函数调用隐式转换为int
,但该值将保持负数。因此,行为不会由C标准定义。
根据6.2.5 3,基本执行字符集的所有成员都具有非负值:
如果基本执行字符集的成员存储在
char
对象中,则其值将保证为非负数。
根据5.2.1 3,基本执行字符集至少包括大写和小写拉丁字母,十位数字,空格,水平制表符,垂直制表符,换页,警告,退格键,回车,换行,和这些字符:
!"#%&’()*+,-./: ;?[\]^_{|}~
因此,如果您的字符串包含任何其他字符,则它可能具有负值。然后,<ctype.h>
函数的行为不是由C标准定义的。