字符串终止符' \ 0'如何?与整数常量0具有相同的值?

时间:2017-12-15 07:46:32

标签: c arrays string null language-lawyer

我有以下代码 -

#include <stdio.h>
#define LENGTH 5
int main(){
    char* ch[LENGTH] = {"Zero", "One", "Two", "Three", "Four"};
    char* pc;
    char** ppc;
    for(int i=0; i<LENGTH; i++){
        ppc = ch+i;
        pc = *ppc;
        while(*pc != 0){
            printf("%c ", *pc);
            pc = pc +1;
        }
        printf("\n");
    }
    return 0;
}

这是使用字符串的多个间接的示例。

输出

Z e r o 
O n e 
T w o 
T h r e e 
F o u r 

此处while()循环代替*pc != '\0',使用*pc != 0

但这两种方法都给出了相同的输出。为什么会这样?

4 个答案:

答案 0 :(得分:6)

signIn(){ let loader = this.ld.create({ content: "Please wait..." }); loader.present(); var headers = { 'Access-Control-Allow-Origin' : '*', 'Access-Control-Allow-Methods' : 'POST' }; let bodyString = JSON.stringify(this.loginData); // Stringify payload var statuscode; this.http.post('http://192.168.3.223:84/fppb/andro_login',this.loginData) .subscribe( function(response) { console.log(response); if(response) { let alert = this.alertCtrl.create({ title: 'Sukses', subTitle: 'Login Berhasil', buttons: ['OK'] }); loader.dismiss(); alert.present(); } else { let alert = this.alertCtrl.create({ title: 'Gagal', subTitle: 'Username atau Password salah', buttons: ['OK'] }); loader.dismiss(); alert.present(); } }, function(error) { let alert = this.alertCtrl.create({ title: 'Gagal', subTitle: 'Username atau Password salah', buttons: ['OK'] }); loader.dismiss(); alert.present(); } ); } 实际上只是一个小整数,因此可以隐式转换为char。此外,字符文字(例如int)实际上由编译器表示为'A'值(例如,文字字符int'A'值{{1}表示} ASCII编码)。

C语言允许使用 escapes 插入任意整数(可以放在int中)。有两种方法可以使用octal数字或使用hexadecimal来转义此类任意值。例如,A的ASCII值为65,可以表示为八进制中的char65,十六进制中的'A' 普通'\101'

有了这些信息,应该很容易看到字符文字'\x41'是整数65的八进制表示。也就是'\0'

您可以通过打印来轻松验证:

0

我提到编译器将所有字符文字视为'\0' == 0值,但也提到使用转义八进制或十六进制数字的任意数字需要适合printf("'\\0' = %d\n", '\0'); 。这似乎是一个矛盾,但事实并非如此。字符值必须适合int,但编译器在解析代码时会在内部将其转换为char

答案 1 :(得分:5)

换行符\n,制表符\t等有自己的转义序列字符,但实际上没有一个用于null终止符。

因此,行业事实上标准化空终止符的标准方法是编写一个值为零的八进制转义序列。八进制转义序列定义为\后跟一个数字。因此\0仅表示零,具有八进制表示。由于这与其他字符转义序列类似,因此它已成为表示空终止符的事实标准方法。

这就是为什么十进制0工作得很好,它只是写零值的另一种方式。如果你想要模糊,你也可以写\x0

答案 2 :(得分:4)

添加现有答案,查看 sentinel ,引用C11,章节§5.2.1

  

在字符常量或字符串文字中,执行字符集的成员应为   由源字符集的相应成员或escape表示   序列由反斜杠\后跟一个或多个字符组成。 一个字节   所有设置为0的位,称为空字符,应存在于基本执行字符集中;它   用于终止字符串。

,见章节§6.4.4.4/ P12,

  

示例1构造'\0'通常用于表示空字符。

因此,常数\0是满足上述属性的常数。这是八进制转义序列

现在,关于价值,引用§6.4.4.4/ P5,(强调我的

  

八进制转义序列中反斜杠后面的八进制数字被视为其中的一部分   整数字符常量或单个字符构造的单个字符   宽字符常数。 八进制整数的数值   forms指定所需字符或宽字符的值。

因此,对于八进制转义序列'\0',值为0(嗯,两者都是八进制,如§6.4.4.1和十进制中所述)。

答案 3 :(得分:4)

0'\0'完全相同,而在C中, int类型。这是由C标准修复的,并且与您平台上的字符编码无关。换句话说,它们完全无法区分。 (在C ++中,'\0'的类型是char。)

因此while(*pc != 0)while(*pc != '\0')while(*pc)都是一样的。

(就个人而言,我发现最后一个给出最清楚的,但有些人喜欢在使用C风格的字符串时使用'\0'符号。)