字符串初始化和打印
String initialization and printing
表3.1在C 引物中的第3.2.1条,第五版状态:
string s3("value")
-> s3是字符串文字的副本,而不是 包括null。
我对此的解释是 - 当我们初始化诸如 string s1("value");
之类的字符串时,变量 s1
包含字符串 value
的副本,而没有 末端的 NUL
字符。
#include <iostream>
using std::cin;
using std::string;
using std::cout;
using std::endl;
int main(void)
{
string s1("value");
cout << s1 << endl; // prints - value
}
那么,此程序是否将UB调用为s1
没有NUL
终结器,我们正在打印字符串?
我之所以问这个,是因为在C中,试图在没有NUL
终结器的情况下打印C弦。C 中的字符串不是强制性的,以NUL
结束?
我在这里缺少什么?
C 的字符串不是强制性的吗?
取决于您所说的"字符串"。std::string
不会以NUL字符结束,因为长度是已知/存储的。std::string::c_str()
返回的C风格字符串(又称char*
数组(必须结束一个NUL字符,因为长度未知/未存储。
那么,此程序是否将UB调用为S1没有NUL终结器,我们正在打印字符串?
否。std::string
提供了"做正确的事情"的operator <<
的过载。您不必担心。
我之所以问这个,是因为试图在没有NUL终结器的情况下打印C弦会产生UB。C 的字符串不是必不可少的吗?
这将取决于您使用的标准版本的哪个版本98/03不需要在字符串的末端有空终结器,但c_str
基本上迫使您这样做。C 11及以上确实保证了字符串数据末端有一个空终结器。
请注意,由于std::string
的operator <<
看起来像
for (size_t i = 0; i < member_variable_size; ++i)
std::cout << member_variable_data[i]
因此,无论是否有一个。实际上,它几乎必须这样做,因为允许std::string
在其中嵌入nulls,并且会像
int main()
{
std::string foo("h ell o", 7);
std::cout << foo;
}
打印
hello
我在这里缺少什么?
此操作员超载将std::string
作为第二个参数。因此,std::cout << s1
不用null终端打印C弦,您正在调用函数operator <<
并将s1
传递给它。
那么,此程序是否将UB调用为
s1
没有NUL终结器,我们正在打印字符串?
通常,您可以依靠使用标准库背后的开发人员的能力,即对我来说,使用此超载运算符对我来说很安全:(
- 是否可以初始化不可复制类型的成员变量(或基类)
- C++使用整数的压缩数组初始化对象
- C++初始化基类
- 多成员Constexpr结构初始化
- 复制列表初始化的隐式转换的等级是多少
- 在C++中初始化和打印 2D 数组
- 为什么调用 cout.operator<<(const char*) 打印地址而不是字符串? 如何创建一个函数本地静态"HashSet<char>"并初始化它一次?
- 字符串初始化和打印
- 为什么通过添加字符串文字和char初始化时,为什么不打印字符串
- 神秘错误;C 类的私有变量即使在初始化后也不会打印其值
- 访问和打印用 new 初始化的矢量的矢量
- 当我在C 中打印一个非初始化的变量时会发生什么
- 初始化结构/类中的向量并打印出来
- 为什么未初始化的变量打印一个奇怪的负值
- 用"*"(特殊字符)初始化向量,然后打印出来
- 当一个变量打印未初始化的变量contain时,在C++中该怎么办
- 哈希表(封闭寻址).如何初始化和打印
- (C++)使用指向整数的顺从指针初始化字符串变量并且它正在打印某些内容?
- 初始化字符串指针数组,并通过函数调用将其打印出来
- 初始化数组工作得很好,但是当试图将其打印出来时,它会打印出一个额外的列和一个意外字符