结束字符`\ 0`是否被视为一个字符或两个字符?

时间:2014-12-24 14:48:10

标签: c++ c gcc scanf

当我试图更多地理解某些函​​数的行为时,我采用了两个例子:

char str[]="Hello\0World"

char str[100];
scanf("%s",str);// enter the same string "Hello\0world"

这里的问题是,在第一个例子中我得到了Hello而在第二个例子中我得到了Hello\0world

为什么两个字符\0在第一个字符串中作为字符串的结束字符而不是第二个字符串?

6 个答案:

答案 0 :(得分:11)

\0转义序列,虽然它由源文件中的两个字符组成,但它被解释为字符串中的单个字符,即空字符。但是,这种特殊解释只发生在源文件中;如果您在运行程序时输入\0,则会将其解释为两个字符\0

答案 1 :(得分:1)

因为当您为scanf输入“Hello \ 0World”时,您不会输入相同内容。

在代码中使用\0表示带有ascii代码0的字符。而当您被提示时,这些转义序列不会被解释。你实际输入一个反斜杠和一个零字符。

所以你的输入将等于“Hello \ 0World”而不是Hello\0 World

答案 2 :(得分:1)

\0是一个字符。在第一种情况下,它被编写为代码,因此被视为特殊符号,如新行(\n)或类似符号,因此打印功能在此处停止。在第二种情况下,您实际上在一个字节中输入两个单独的字符\和第二个0,因此不会将其作为终止符号进行威胁。如果你想放置真实的"来自键盘的\0在这里查看How to simulate NUL character from keyboard?

答案 3 :(得分:1)

这是一个非常好的问题!我的假设是,当您按照预期在第3行声明字符串时,编译器能够识别出存在转义字符并适当地分配\ 0。接下来当您从scanf读取时,因为您的代码已经编译,程序无法知道将输入哪些字符,因此不会将\视为转义字符,只是将其视为斜杠。

以下是我根据您编写的示例代码,尝试解决此问题:

#include<stdio.h>
int main(){
  char str1[]="Hello\0World";
  printf("str1 = %s\n",str1);
  char str2[100];
  scanf("%s",str2);
  printf("str2 = %s",str2);
}

答案 4 :(得分:0)

在您的第一个语句中,char str[]="Hello\0World" '\0'以NULL结尾。字符串将'\ 0'视为字符串的结尾。

在你的第二个陈述中,scanf()接受输入,直到出现空格。

整体'\0'只是一个字符。 '\'用于无知

答案 5 :(得分:0)

在第一种情况下:

char str[]="Hello\0World"

编译器解释了字符串并在字符串中放置了一个空终止符(\0)。

在第二种情况下:

char str[100];
scanf("%s",str);// enter the same string "Hello\0world"

您已输入字符串,并且已进行编译器解释。这和你输入的一样:

char str[]="Hello\\\0World"