拥有以下对象:
const char a[]{"abcdefghij"}; // Array of characters (length 11)
const std::string s{"abcdefghij"}; // Standard basic_string<char>
我希望以下循环的行为相同:
// #1 Outputs NOTHING, expected "jihgfedcba"
for (auto begin = std::rbegin(a), end = std::rend(a); begin != end; ++begin)
std::cout << *begin;
std::cout << std::endl;
// #2 Outputs "jihgfedcba", as expected
for (auto begin = std::rbegin(s), end = std::rend(s); begin != end; ++begin)
std::cout << *begin;
std::cout << std::endl;
但是打印字符数组不会输出任何内容,而打印字符串会显示预期的输出。
打印字符数组也会影响字符串的打印:如果在#2之前写入#1循环,程序只会输出顺序,而是显示单个jihgfedcba
。
我注意到调整std::rbegin(a)
的返回值可以解决问题:
// Outputs "jihgfedcba", as expected
// notice the ++!!
for (auto begin = ++std::rbegin(a), end = std::rend(a); begin != end; ++begin)
std::cout << *begin;
std::cout << std::endl;
// Outputs "jihgfedcba", as expected
for (auto begin = std::rbegin(s), end = std::rend(s); begin != end; ++begin)
std::cout << *begin;
std::cout << std::endl;
为什么会这样?
答案 0 :(得分:1)
char
数组包含:
{'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', '\0'} // 11 characters
虽然std::string
包含:
"abcdefghij" // 10 characters
在第一种情况下,最后一个字符(循环中的第一个字符)是'\ 0'。当你“调整”循环时,你会跳过这个角色。
即使我无法重现您的行为,我也希望这是问题的根源。