微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C 程序中使用 0 而不是 '\0'

如何解决在 C 程序中使用 0 而不是 '\0'

为什么我的程序没有进入无限循环。我没有使用 '\0' 来测试 while 循环中的字符串结尾,而是使用了 0。 C 中的 '\0'0 是否相同?

如果是,那么如果 0 在字符串的中间,那么 printf 应该在那里结束打印字符串。 例如printf("%s","hello how0 are you") 应该打印 'hello how'

int main( )
{
    char s[ ] = "No two viruses work similarly" ;
    int i = 0 ;
    while ( s[i] != 0 )
    {
        printf ( "%c",s[i]) ;
        i++ ;
    }
}

解决方法

'\0'0 的含义相同,但 '0'0 的含义不同。

printf("%s","hello how0 are you") 将打印 hello how0 are you

printf("%s","hello how\0 are you") 将打印 hello how

,

在 C 语言中,'\0' 的含义与整数常量 0 完全相同(相同的值零,相同的类型 int)。

此外,对于阅读代码的人来说,写 '\0' 表明您打算使用这个特定的零作为字符(空)。

,

'\0'0 在 C 中是相等的,因为 ASCII(ANSI、UTF-8 等)字符编码将 '\0' 字符的代码定义为 0 .在 C 中,可以将字符隐式转换为整数,生成的整数将等于字符代码(例如,'A' 将转换为 65)。

如果您将字符串的一个字符设置为 '\0'0,它将终止该字符串。

测试代码(online):

#include <stdio.h>

int main() {
    // Are they equal? Yes!
    char zc = '\0';
    char zi = 0;
    printf("%d\n",zc == zi); // Prints 1
    
    
    // Does setting a char to 0 terminate a string? Yes!
    char s[] = "hello,world";
    printf("%s\n",s); // Prints hello,world
    s[5] = 0;
    printf("%s\n",s); // Prints hello
    
    return 0;
}

同样重要的是,字符串文字(如上面代码中的 s)自动具有终止符 '\0',但它不会显示在字符串文字中。

将内部的 '\0' 字符放入字符串文字中可能听起来很愚蠢,因为字符串的长度被定义为第一个 '\0' 之前的字符数,而 printf 也只打印这些字符。但是内部 '\0' 确实在实践中使用,例如在 Windows 上为打开/保存文件对话框设置文件类型过滤器时 (link,link)。这里内部的零字符用作过滤器分隔符:

ofn.lpstrFilter = "Text files (*.txt)\0*.txt\0All files (*.*)\0*.*\0";

enter image description here

,

在 C 源代码中,0'\0' 实际上是相同的:每个都是值为零的 int 常量。 '\0' 用于表示我们正在处理字符,但它与编译器的 0 相同。 (在 C++ 中,'\0'char 而不是 int。)

显示字符“0”的代码不为零。在 ASCII 中,它是 48。在任何 C 实现中,它都可以写成 '0'。即使 C 实现使用除 ASCII 以外的某些字符编码,此值也将始终为正数而不是零。因此,字符串中间的字符“0”不会充当空终止符。

,

'\0' 和 0 在 C 中相同吗?

是的,它们是编写相同整数常量 0 的不同方式。C 中的两个常量(与 C++ 相反)都具有类型 int 和相同的表示。

为什么我的程序没有进入无限循环。我没有使用 '\0' 测试字符串以 while 循环结束,而不是我使用 0

这个while循环中的条件

while ( s[i] != 0 )

等价于条件

while ( s[i] != '\0' )

正如上面所指出的。

如果 0 在字符串的中间,那么 printf 应该结束打印 字符串就在那里。例如printf("%s","你好,你好吗") 应该 打印“你好”

这个字符串文字

"hello how0 are you"

没有嵌入的零字符。这个带有嵌入零字符的字符串可以通过以下方式查找例如

"hello how\0 are you" 
,

0'\0' 是一样的,但与其说是这样,不如解释一下这些不同的输入零的方式究竟是什么。

在 C 中有很多情况可以使用整数值 0。显然,它可以用作普通整数或数组索引。但它也可用于创建空指针。另一个用途是字符串的空终止。

由于空指针和字符串的空终止是截然不同的事物,因此混淆术语的风险很大。在黑暗时代的某个时候,通过将空指针称为 NULL 并创建一个这样命名的宏,将其扩展为空指针常量来区分。符号表中的字符 0(“空字符”)被称为 NUL 和单个 L。仍然令人困惑。

此外,C 从未为空终止定义转义序列,就像为换行符 \n、制表符 \n 等所做的那样。所以没有办法在字符串的一部分时输入空终止字符。

然后有人(Kernighan 和 Ritchie?)想出了在 C 中使用其他已经存在的转义序列来达到这个目的的想法。在字符串或字符文字中,我们可以使用转义序列来键入表中符号的索引。这可以使用八进制或十六进制表示法来完成。

例如,带有十进制值 10 的换行符可以在字符串中输入为 \012(八进制)或 \xA(十六进制)。这些称为八进制/十六进制转义序列。示例:

puts("test\ntest\012test\xAtest");

给予

test
test
test
test

同样,我们可以使用转义序列编写空字符,八进制 \0 或十六进制 \x0。八进制版本成为空终止的惯例和事实上的标准。

,

'\0'value 0 的字符。它用于终止 C 中的字符串。所以,是的,循环

while ( s[i] != 0 )

工作得很好,虽然更传统的写法是

while ( s[i] != '\0' )

强调我们正在处理字符。

另一方面,'0'是看起来像数字0的字符,虽然这个字符在ASCII字符集中的是48。但是在任何情况下,该值都不是 0!所以当你写

printf("%s","hello how0 are you");

它打印 hello how0 are you,因为 0 是一个普通字符,并且不会终止字符串。如果你写了

printf("%s","hello how\0 are you");

那么你会有一个空字符,它终止字符串。

,

0 是字符 '\0' 的 ascii 值。 0 不是 '0' 字符的 ascii 值。

,

我想把它放到评论中,但评论太长了。

C 中的 '\0' 和 0 是否相同

我建议你试试这个:

int main( )
{
    char s[ ] = "No two viruses work similarly" ;
    int i = 0 ;
    while ( s[i] != 0 )
    {
        printf ( "%d",s[i]); // this will print decimal values of
                              // all characters before `\0`
        ++i;
    }
    printf ("%d",s[i]); // this will print decimal value of `\0`
}

您也可以这样做:

printf("%d\n",'\0');

它会回答你的第一个问题。

如果是,那么如果 0 在字符串的中间,那么 printf 应该在那里结束打印字符串。例如printf("%s","hello how0 are you") 应该打印 'hello how'。

"" 或 '' 中的 0 被视为 ASCII 字符,因此试试这个:

printf("%d\n",'0');

那应该给你 ASCII 字符“0”的十进制值。并查看 ASCII 字符表。

作为有趣的练习,您可以这样做:

printf("%d\n",'0' - '\0');
,

在C中,对于每个字符,都有一个对应的ASCII值,基本上是0到127之间的整数。

例如,当您声明时:

char a[] = "Hello";

然后,数组实际上有6 个元素,而不是5。您可以使用以下方法对其进行测试:

int n = sizeof(s)/sizeof(s[0]);
printf("%d\n",n);

该字符串的实际表示已变为:Hello\0

在这里,您可以看到 \ 符号,它被称为 Escape Character,它类似于对该字符的另一种解释。这里 \0 表示字符数组索引上的 ASCII 值 0。但是,如果没有转义字符,0 只是一个普通字符 - 而不是替代表示。

现在如果你想查看前一个字符串每个字符对应的ASCII值——Hello,运行这个:

int i;
for (i = 0; i < 6; i++) {
    printf("%d ",s[i]);
}

// Output: 72 101 108 108 111 0 

关于你最初的问题:

'\0' 和 0 在 C 中相同吗?

ASCII 0 和 char 0 是不同的。但是char \0代表0的ASCII值。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。