C++ 字符串数组长度C++;问题
我知道字符串数组以“\0”符号结尾。因此,下面的代码应该打印0、1、2和3。(注意,我使用的是基于范围的for()循环) 这里发生了什么?为什么不认为字符串以“\0”结尾?C++集合是否考虑(我想象C++ 11)字符串不同于经典C++?< /p> 此外,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'不被特别考虑 在一个
“0123\0abc”
中的字符数为8。注意,打印输出有9行
(我知道
std::couts
属于char[9]
类型,即一个包含9char
s(包括空终止符char'\0')的数组。仅对所有9个元素进行迭代器,空终止符char'\0'
不被特别考虑
在一个范围内执行for循环
用作与传统for循环更具可读性的等价物
在一系列值上操作,例如容器中的所有元素
for(char c:s)std::cerrs
属于char[9]
类型,即一个包含9char
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...
}