[英]The end character `\0` is it considered as one character or two characters?
当我试图更多地理解一些函数的行为时,我拿了两个例子:
char str[]="Hello\0World"
和
char str[100];
scanf("%s",str);// enter the same string "Hello\0world"
这里的问题是,在第一个例子中,我得到了Hello
,在第二个例子中,我得到了Hello\\0world
为什么两个字符\\
和0
在第一个字符串中作为字符串的结束字符而不是第二个字符串?
\\0
是一个转义序列 ,虽然它由源文件中的两个字符组成,但它被解释为字符串中的单个字符,即空字符。 但是,这种特殊解释只发生在源文件中; 如果你在运行程序时输入\\0
,它会被字面解释为两个字符\\
和0
。
因为当您为scanf
输入“Hello \\ 0World”时,您不会输入相同的内容。
在代码中使用\\0
表示带有ascii代码0的字符。而当您被提示时,这些转义序列不会被解释。 您实际输入反斜杠和零字符。
所以你的输入将等于“Hello \\ 0World”而不是Hello\\0 World
\\0
是一个字符。 在第一种情况下,它被编写为代码,因此被视为特殊符号,如新行( \\n
)或类似符号,因此打印功能在此处停止。 在第二种情况下,你实际上在一个字节中输入两个单独的字符,你有\\
和第二个0
所以它不会被威胁作为终止符号。 如果你想从键盘放置“真实” \\0
,请看这里如何从键盘模拟NUL字符?
这是一个非常好的问题! 我的假设是,当您按照预期在第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);
}
在第一个语句中, char str[]="Hello\\0World"
'\\0'
是NULL终止的。 字符串将'\\ 0'视为字符串的结尾。
在第二个语句中, scanf()
接受输入直到出现空格。
整体'\\0'
只是一个字符。 '\\'
用于无知
在第一种情况下:
char str[]="Hello\0World"
编译器解释了字符串并在字符串中放置了一个空终止符( \\0
)。
在第二种情况:
char str[100];
scanf("%s",str);// enter the same string "Hello\0world"
你输入了字符串,并且已经进行了编译器解释。 就像你输入的一样:
char str[]="Hello\\\0World"
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.