21

我用 C 编写了这个函数,它的目的是遍历一个字符串到下一个非空白字符:

char * iterate_through_whitespace(unsigned char * i){
    while(*i && *(i++) <= 32);
    return i-1;
}

它似乎工作得很好,但我想知道是否可以安全地假设*i在这种情况下将被评估为假*i == '\0',并且它不会迭代到字符串的末尾。它在我的计算机上运行良好,但我想知道它在其他机器上编译时是否会表现相同。

4

4 回答 4

15

标准说:

一个所有位都设置为 0 的字节,称为空字符,应存在于基本执行字符集中;它用于终止一个字符串。

于 2011-09-25T22:57:36.640 回答
14

是的——但在我看来,更明确的风格更好:

while (*i != '\0' && ...

但与 to 进行比较32并不是最好的方法。 32恰好是空格字符的 ASCII/Unicode 代码,但 C 不保证任何特定的字符集——并且有很多值小于 32 的控制字符不是空格。

使用该isspace()功能。

(而且我永远不会命名指针i。)

于 2011-09-25T22:58:03.057 回答
3

在 C 中,'\0'具有与 完全相同的值和类型0'\0'除了丑化你的代码之外,没有任何理由去写。\0然而,在双引号内可能有用,以制作嵌入空字节的字符串。

于 2011-09-26T00:28:32.240 回答
0

ASCII 标准规定 NUL 字符被编码为 byte 0。除非您停止使用向后兼容 ASCII 的编码,否则不会出错。

于 2011-09-25T22:59:08.047 回答