C 是'\0';保证为0?

C 是'\0';保证为0?,c,nul,C,Nul,我用C编写了这个函数,它意味着通过字符串迭代到下一个非空白字符: char * iterate_through_whitespace(unsigned char * i){ while(*i && *(i++) <= 32); return i-1; } char*在空格中迭代(无符号char*i){ 而(*i&&*(i++)标准规定: 应存在所有位均设置为0的字节,称为空字符 在基本执行字符集中;用于终止 字符串 是的,但在我看来,更明确是更好的方式:

我用C编写了这个函数,它意味着通过字符串迭代到下一个非空白字符:

char * iterate_through_whitespace(unsigned char * i){
    while(*i && *(i++) <= 32);
    return i-1;
}
char*在空格中迭代(无符号char*i){
而(*i&&*(i++)标准规定:

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

是的,但在我看来,更明确是更好的方式:

while (*i != '\0' && ...
但是与
32
进行比较并不是最好的方法。
32
恰好是空格字符的ASCII/Unicode代码,但C不能保证任何特定的字符集,而且有很多值小于32的控制字符不是空格

使用
isspace()
函数



(而且我从不给指针命名
I

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

在C中,
'\0'
0
具有完全相同的值和类型。没有理由编写
'\0'除了丑化你的代码之外。
\0
在双引号中可能有用,可以生成嵌入空字节的字符串。

好问题。更多的人在假设之前应该问问自己。Triva:当你将UTF8字符串设为空时会发生什么?在UCS-16中,在双/三/四字节的前导之后?终止符是两个字节还是两个字节UNICODE是否不推荐使用零终止符?@sehe:空终止符通常适用于UTF-8字符串。适用于UCS-2或UTF-16(非UCS-16),空终止符是16位。@Keith:您的观点是正确的,但不完整。在部分字符后带有空终止符的UTF-8字符串格式不正确,当使用标准库函数转换空字节时遇到空字节时,将导致
EILSEQ
。@R..:那么我认为它不是UTF-8字符串。这不会导致对于非转换函数,如
strcpy()
,出现
EILSEQ
错误。不过,这是一个很好的观点。(至少目前,原始海报可能会忽略这些细节。)所有位都设置为0的字节的值为0。这可能看起来很明显,而且是真的,但你必须在标准中进行一些搜索来证明它。@Keith Thompson我在搜索一个更有力的断言,但我似乎找不到任何真正相关的东西。我想我看到了一个勘误表,该勘误表确保将mema和int设置为0d是一个0值,但我找不到oit。你必须深入研究6.2.6.2,它涵盖了整数类型的表示。它需要一个二进制表示(它定义了)并且表示字符类型没有填充位。@Artefactor:N256 6.2.6.2p5--但是字符类型所需的填充位不足使得这些类型没有必要。C标准也规定了这一点。这个问题与ASCII无关,C标准甚至不要求使用ASCII。@Artefactor,因此“除非您停止使用向后兼容ASCII的编码“。我没有尝试将C与ASCII链接。@Artefactor:好吧,这个问题确实使ASCII特定的假设成为空白字符有值@zneak:不管您是否使用ASCII兼容的编码。任何C实现使用的所有编码,无论是否使用ASCII,都必须将空字符表示为0。(碰巧,ASCII和EBCDIC都是这样做的;如果不是这样,C标准可能就不需要了。)+1谢谢!我对isspace()从来都不陌生我使用它。<代码> i <代码>是迭代器的缩写。@ PulPro: I/C> >整数。“C++中,我认为 > 是迭代器的通用名称。你肯定吗?我经常看到<代码> I/C>作为迭代器,嵌套循环<代码> i,j,k,L。@ PulPro:“你确定吗?”不。我不同意。它的类型和值确实与
0
相同,但我更喜欢在将其用作字符时使用
'\0'
,正如我喜欢在指针上下文中使用
NULL
而不是
0
。@Keith,我同意
'\0'
,对于
NULL
,空指针的技术细节如下太混乱了,我更喜欢使用
0
,因为它是明确的。@JensGustedt:
NULL
怎么会不明确?当作为变量参数传递时,你需要强制转换它,但同样的情况也适用于
0
。使用
NULL
可以隐藏错误,因为你有指针类型而不是整数类型de>NULL
可以是整数类型。使用
0
将使代码立即中断(或至少抛出相关警告)所以你可以修复它。我同意Jens的观点,也避免在@Keith使用
NULL
,不幸的是
NULL
没有强制转换在很多平台上都可以,没有强制转换的
0
会可靠崩溃。