【问题标题】:The end character `\0` is it considered as one character or two characters?结束字符 `\0` 被认为是一个字符还是两个字符?
【发布时间】:2015-02-22 16:10:00
【问题描述】:

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

char str[]="Hello\0World"

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

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

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

【问题讨论】:

  • 我在这里没有看到两个字符串。
  • C 编译器会将其设为单个字符。 scanf() 函数不知道 bean 关于转义序列,它看到两个字符。
  • 我实际上是在询问不同的行为,而不是字符 \0 的含义! @CliffRibaudo
  • @tanit 也许你最好试着理解汉斯的意思。编译器解释文字中的转义字符。但是scanf 不会对您输入的文本这样做。

标签: c++ c gcc scanf


【解决方案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);
}

【讨论】:

    【解决方案2】:

    \0 是一个字符。在第一种情况下,它是用被视为特殊符号的代码编写的,比如换行符 (\n) 或类似的,所以打印功能在这里停止。在第二种情况下,您实际上是在一个字节中输入两个单独的字符,您有\ 和第二种0,因此它不会作为终止符号受到威胁。如果你想从键盘上放置“真实的”\0,请看这里How to simulate NUL character from keyboard?

    【讨论】:

      【解决方案3】:

      第一种情况:

      char str[]="Hello\0World"
      

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

      第二种情况:

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

      您已经输入了字符串,并且已经进行了编译器解释。就像你输入的一样:

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

      【讨论】:

      • 我会说在第二种情况下用户输入了char str[]="Hello\\0World"
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

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

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

        【讨论】:

          【解决方案6】:

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

          在您的第二个语句中,scanf() 接受输入,直到出现空格。

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

          【讨论】:

          • C-"strings" 或由NUL 字符(又名'\0' 又名null)终止。 NULL(带有两个 ells的大写字母)是不同的。
          猜你喜欢
          • 1970-01-01
          • 2011-10-24
          • 1970-01-01
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 1970-01-01
          • 2017-01-21
          • 1970-01-01
          相关资源
          最近更新 更多