繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM