【发布时间】:2011-09-25 22:54:17
【问题描述】:
我用 C 写了这个函数,它的目的是遍历一个字符串到下一个非空白字符:
char * iterate_through_whitespace(unsigned char * i){
while(*i && *(i++) <= 32);
return i-1;
}
它似乎工作得很好,但我想知道在*i == '\0' 的情况下假设*i 将被评估为false 是否安全,并且它不会在结束后迭代细绳。它在我的计算机上运行良好,但我想知道它在其他机器上编译时是否会表现相同。
【问题讨论】:
-
好问题。更多的人应该在假设之前问自己。 Triva:当你对一个 UTF8 字符串进行空终止时会发生什么?在双/三/四字节领导者之后?在 UCS-16 中?那么终止符是两个字节,还是 UNICODE 不推荐使用零终止符?
-
@sehe:空终止符对 UTF-8 字符串正常工作。对于 UCS-2 或 UTF-16(不是 UCS-16),空终止符是 16 位。
-
@Keith:您的观点是正确的,但不完整。 UTF-8 字符串在部分字符后具有空终止符是格式错误的,并且在使用标准库函数转换时遇到空字节时将导致
EILSEQ。 -
@R..:那么我认为它不是 UTF-8 字符串。对于像
strcpy()这样的非转换函数,它不会导致EILSEQ错误。不过,好点。 (而且最初的发帖人可能会忽略这些细节,至少现在是这样。)