当我试图更多地理解某些函数的行为时,我采用了两个例子:
char str[]="Hello\0World"
和
char str[100];
scanf("%s",str);// enter the same string "Hello\0world"
这里的问题是,在第一个例子中我得到了Hello
而在第二个例子中我得到了Hello\0world
为什么两个字符\
和0
在第一个字符串中作为字符串的结束字符而不是第二个字符串?
答案 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"