我看到std::string有很多构造函数https://cplusplus.com/reference/string/string/string/。
但我使用哪一个当我这样做:
const char* s = "abc";
string str(s);
我打赌是:
从c字符串(4)字符串(常量字符 * s);
(4)来自C字符串
复制s所指向的以空结尾的字符序列(C字符串)。
但是c-string不是总是以空结尾吗?s
不符合我的ide/debugger(macOS上的Qt Creator)。
我的行为是否尚未定义?
我是否应该改为执行以下操作?
const char* s = "abc";
string str(s, 3);
3条答案
按热度按时间relj7zay1#
s
不符合我的ide/调试器(macOS上的Qt Creator)。调试器可能只是没有显示终止符。字符串文本总是以null终止。您可以自己查看:
输出:
但如果您手动创建字符串,则需要对终止符负责:
wi3ka0sx2#
但是c字符串不总是以空结尾吗?
是的,字符串文本以空终止。调试器/ide可能没有显示您的情况下的空终止符。
从string literal开始:
无前缀字符串字面量的类型是
const char[N]
,其中N
是以执行窄编码(C ++23之前)和普通字面量编码(C ++23起)的代码单元表示的字符串大小,包括空终止符。我的行为是否尚未定义?
不,完全不是。两个给定的代码段都是格式良好的。
rekjcdws3#
像“abc”这样的字符串文字总是以空值结尾。你可以用你的第一个例子。通常你会这样写它:
编辑,见以下评论:在字符串对象str 'abc'内部,它很可能不会以null结尾(直到您最终调用str.c_str())。