gpt4 book ai didi

c++ - 在临时字符串上使用基于范围的循环时为空字符?

转载 作者:行者123 更新时间:2023-12-04 15:56:40 25 4
gpt4 key购买 nike

当我使用基于范围的 for 循环遍历临时 std::string (右值?)时,似乎有一个额外的字符,即空终止符 \0.

当字符串不是临时的(而不是左值?)时,没有多余的字符。为什么?

    std::map<char, int> m;

for (char c : "bar") m[c] = 0;

for (auto [c, f] : m) {
if (c == '\0') std::cout << "this is a null char, backward slash zero" << std::endl;
std::cout << c << std::endl;
}

输出:

this is a null char, backward slash zero

a
b
r

(注意空行,\0 正在打印)

相比:

    std::map<char,int> m;

std::string s = "bar";

for (char c : s) m[c] = 0;

for (auto [c, f] : m) {
if (c == '\0') std::cout << "this is a null char, backward slash zero" << std::endl;
std::cout << c << std::endl;
}

输出:

a
b
r

最佳答案

因为"bar"不是std::string,而是char数组(const char[4]) 包含 4 个元素,包括最后一个空字符。 IE。 c-style string literal :

The null character ('\0', L'\0', char16_t(), etc) is always appended to the string literal: thus, a string literal "Hello" is a const char[6] holding the characters 'H', 'e', 'l', 'l', 'o', and '\0'.

对于临时 std::string,它将按您的预期工作,即不包含空字符。

for (char c : std::string{"bar"}) m[c] = 0;

或者

using namespace std::string_literals;
for (char c : "bar"s) m[c] = 0;

顺便说一下 @HolyBlackCat suggested您也可以使用 std::string_view (自 C++17 起)从 c 样式的字符串文字构造时不包含以空字符结尾的字符。例如

for (char c : std::string_view{"bar"}) m[c] = 0;

或者

using namespace std::literals;
for (char c : "bar"sv) m[c] = 0;

关于c++ - 在临时字符串上使用基于范围的循环时为空字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69159188/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com