Range For在字符串上循环,在末尾添加null或空字符



这里有一个循环,它遍历"(Level:"中的每个字符。它在末尾添加了一些东西,这会打乱我的代码的其余部分。

#include <iostream>
int main() {
std::cout << "Output:" << std::endl;
for (char letter : "(Level:") {
std::cout << "'" << letter << "'" << std::endl;
}
return 0;
}

输出:

'('
'L'
'e'
'v'
'e'
'l'
':'
''

我刚接触C++,不明白发生了什么。

"(Level:"的类型为const char[8],相当于{ '(', 'L', 'e', 'v', 'e', 'l', ':', '' }

通过在打印前将字母转换为int,您可以很容易地看到这种情况。演示

之所以会发生这种情况,是因为字符串文字(任何"..."(都是以零结尾的C字符串。如果希望字符串具有大小而不是零终止符,可以使用string_view文字:

#include <iostream>
#include <string_view>
using namespace std::literals::string_view_literals;
int main() {
std::cout << "Output:" << std::endl;
for (char letter : "(Level:"sv) {
std::cout << "'" << letter << "' (" << static_cast<int>(letter) << ")n";
}
return 0;
}

查看结果

因为C++中的字符串都以"\0"结尾,我们看不到它,但它确实存在。此隐藏的"\0"可以标记字符串的末尾,并且可以由"for"语句读取。您可以在"for"语句中添加一个"if"语句来处理"\0"。

#include <iostream>
int main() {
std::cout << "Output:" << std::endl;
for (char letter : "(Level:") {
if (letter != '')
std::cout << "'" << letter << "'" << std::endl;
}
return 0;
}

最新更新