C++ 字符串数组长度C++;问题

C++ 字符串数组长度C++;问题,c++,arrays,string,c++11,C++,Arrays,String,C++11,我知道字符串数组以“\0”符号结尾。因此,下面的代码应该打印0、1、2和3。(注意,我使用的是基于范围的for()循环) 这里发生了什么?为什么不认为字符串以“\0”结尾?C++集合是否考虑(我想象C++ 11)字符串不同于经典C++?< /p> 此外,“0123\0abc”中的字符数为8。注意,打印输出有9行 (我知道std::couts属于char[9]类型,即一个包含9chars(包括空终止符char'\0')的数组。仅对所有9个元素进行迭代器,空终止符char'\0'不被特别考虑 在一个

我知道字符串数组以“\0”符号结尾。因此,下面的代码应该打印0、1、2和3。(注意,我使用的是基于范围的for()循环)

这里发生了什么?为什么不认为字符串以“\0”结尾?C++集合是否考虑(我想象C++ 11)字符串不同于经典C++?< /p> 此外,
“0123\0abc”
中的字符数为8。注意,打印输出有9行


(我知道
std::cout
s
属于
char[9]
类型,即一个包含9
char
s(包括空终止符char'\0')的数组。仅对所有9个元素进行迭代器,空终止符char
'\0'
不被特别考虑

在一个范围内执行for循环

用作与传统for循环更具可读性的等价物 在一系列值上操作,例如容器中的所有元素


for(char c:s)std::cerr
s
属于
char[9]
类型,即一个包含9
char
s(包括空终止符char'\0')的数组。仅对所有9个元素进行迭代器,空终止符char
'\0'
不被特别考虑

在一个范围内执行for循环

用作与传统for循环更具可读性的等价物 在一系列值上操作,例如容器中的所有元素


for(char c:s)std::cerr当您将
char[]
声明为
char s[]=“0123\0abc”
(a)时,
s
将成为
char[9]
。包含
\0
,因为它也需要空间


使用的基于循环的范围不考虑<代码> char(9)

作为包含
char
且范围
9
的数组以外的任何东西,并将愉快地为循环的内部工作提供数组中的每个元素。
\0
只是此上下文中的
char
之一。

当您将
char[]
声明为
char s[]=“0123\0abc”
(a),
s
变成
char[9]
。之所以包含
\0
,是因为它也需要空间

使用的基于循环的范围不考虑<代码> char(9)< /C>作为包含<代码> char < /代码>的数组,其范围<>代码> 9 <代码>,将愉快地将数组中的每个元素提供给循环的内部工作。<代码> 0 只是该上下文中的<代码> char < /C> >

  • 这里的s是一个字符的数组,因此它也包括
    \0
    。 当您对(char c:s)
  • 使用
    时,循环将搜索数组中的所有
    char
    。 但在C中,定义告诉我们:

    字符串是以第一个空字符结尾并包含该空字符的连续字符序列

    […]字符串的长度是空字符前面的字节数,字符串的值是包含字符的值序列

    因此,当您使用C标准函数将数组s打印为字符串时,您将看到所需的结果。例如:
    printf(“%s”,s);

  • “0123\0abc”中的字符数为8。请注意,打印输出有9行

    同样,
    printf(“%s;Len=%d”,s,strlen(s));
    运行正常

      • 这里的s是一个字符的数组,因此它也包括
        \0
        。 当您对(char c:s)
    使用
    时,循环将搜索数组中的所有
    char
    。 但在C中,定义告诉我们:

    字符串是以第一个空字符结尾并包含该空字符的连续字符序列

    […]字符串的长度是空字符前面的字节数,字符串的值是包含字符的值序列

    因此,当您使用C标准函数将数组s打印为字符串时,您将看到所需的结果。例如:
    printf(“%s”,s);

  • “0123\0abc”中的字符数为8。请注意,打印输出有9行

    同样,
    printf(“%s;Len=%d”,s,strlen(s));
    运行正常


  • 请注意,
    char
    不一定只需要定义一个字符–它可以用来存储任意8位值(在某些机器上,char更宽,但遇到的是已经有16位字符的机器–那么就没有可用的
    int8\u t
    ),尽管根据具体需要,
    有符号字符
    无符号字符
    应该是首选,因为
    字符
    的有符号性是由实现定义的(或者更好的是:
    int8_t
    uint8_t
    来自
    cstdint
    头,只要它们可用)

    因此,字符串文字实际上只是一个包含九个整数值的数组(就像创建了一个int数组一样,只有类型通常更窄)。基于范围的for循环将迭代所有这九个8位整数,并在示例中获得输出

    这些积分值仅在特定上下文(函数)中具有特殊意义,例如
    printf
    放入
    ,或者甚至将它们解释为字符。当用作C字符串时,这样一个数组中的0值标记字符串的结尾–但是这个0字符仍然是该字符串的一部分。如图所示:
    放入
    ,可能如下所示:

    int puts(char const* str)
    {
        while(!*str) // stops on encountering null character 
        {
            char c = *str;
    
            // + get pixel representation of c for console, e. g 'B' for 66
            // + print this pixel representation to current console position
            // + advance by one position on console
    
            ++str;
        }
        return 0; // non-negative for success, could return number of
                  // characters output as well...
    }
    

    请注意,
    char
    不一定只需要定义一个字符–它可以用来存储任意8位值(在某些机器上,字符更宽,但是遇到一个已经有16位字符的机器–那么就没有可用的
    int8\u t
    了,尽管
    有符号字符
    无符号字符)
    
    $ ./app
    -->0
    -->1
    -->2
    -->3
    -->
    -->a
    -->b
    -->c
    -->
    
    $ _
    
    {
      auto && __range = s ;
      auto __begin = __range ;         // get the pointer to the beginning of the array 
      auto __end = __range + __bound ; // get the pointer to the end of the array ( __bound is the number of elements in the array, i.e. 9 )
      for ( ; __begin != __end; ++__begin) {
        char c = *__begin;
        std::cerr<<"-->"<<c<<std::endl;
      }
    }
    
    int puts(char const* str)
    {
        while(!*str) // stops on encountering null character 
        {
            char c = *str;
    
            // + get pixel representation of c for console, e. g 'B' for 66
            // + print this pixel representation to current console position
            // + advance by one position on console
    
            ++str;
        }
        return 0; // non-negative for success, could return number of
                  // characters output as well...
    }