将char转换为int作为isspace的参数的惯用方式?

时间:2019-04-22 19:01:04

标签: c string char

我正在使用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一起使用的理想方式是什么?

1 个答案:

答案 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。而且通常也不是EOFchar负值将通过函数调用隐式转换为int,但该值将保持负数。因此,行为不会由C标准定义。

根据6.2.5 3,基本执行字符集的所有成员都具有非负值:

  

如果基本执行字符集的成员存储在char对象中,则其值将保证为非负数。

根据5.2.1 3,基本执行字符集至少包括大写和小写拉丁字母,十位数字,空格,水平制表符,垂直制表符,换页,警告,退格键,回车,换行,和这些字符:

!"#%&’()*+,-./: ;?[\]^_{|}~

因此,如果您的字符串包含任何其他字符,则它可能具有负值。然后,<ctype.h>函数的行为不是由C标准定义的。