c++ 我使用的是哪个std::string构造函数?

a5g8bdjr  于 2022-12-30  发布在  其他
关注(0)|答案(3)|浏览(219)

我看到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);
relj7zay

relj7zay1#

s不符合我的ide/调试器(macOS上的Qt Creator)。
调试器可能只是没有显示终止符。字符串文本总是以null终止。您可以自己查看:

#include <iostream>

int main() {
    for (char ch : "abc") {
        std::cout << +ch << '\n';
    }
}

输出:

97
98
99
0

但如果您手动创建字符串,则需要对终止符负责:

char cs1[] {'a', 'b', 'c'};        // not null terminated
char cs2[] {'a', 'b', 'c', '\0' }; // properly terminated
std::string s1(cs1);               // undefined behavior
std::string s2(cs2);               // OK
wi3ka0sx

wi3ka0sx2#

但是c字符串不总是以空结尾吗?
是的,字符串文本以空终止。调试器/ide可能没有显示您的情况下的空终止符。
string literal开始:
无前缀字符串字面量的类型是const char[N],其中N是以执行窄编码(C ++23之前)和普通字面量编码(C ++23起)的代码单元表示的字符串大小,包括空终止符
我的行为是否尚未定义?
不,完全不是。两个给定的代码段都是格式良好的。

rekjcdws

rekjcdws3#

像“abc”这样的字符串文字总是以空值结尾。你可以用你的第一个例子。通常你会这样写它:

std::string str = "abc";

编辑,见以下评论:在字符串对象str 'abc'内部,它很可能不会以null结尾(直到您最终调用str.c_str())。

相关问题