`std::swap` 在字符串操作中没有按预期工作

`std::swap` doesn't work as intended in string manipulation

我尝试通过交换两个连续的字母来进行基本的字符串加密。 它并没有真正按照我的预期工作。

#include <iostream>
#include <string.h>
#include <algorithm>

int main() 
{
    std::string str = "This is a simple string.";
    for (int i = 0; i <= str.length(); i++) {
        std::swap(str[i], str[i + 1]);
    }
    std::cout << str;
    std::cin.get();
}

我想实际交换两个相邻的字母,这样它看起来像加密的。 当前结果是

his is a simple string.

首先,由于

,您有越界访问权限
for (int i = 0; i <= str.length(); i++) 
//                ^^^^

因此 behavior of your program is undefined。 你想迭代一个超过字符串的大小。除此之外,仅当字符串不为空时才循环(credits @jww).

其次,比较intunsigend int(即str.length()which is also not you want

最后但同样重要的是,为 std::string 添加正确的 header( 正如 @PaulMcKenzie 在评论中指出的 )。

总而言之,您可能想要这个

#include <string>

for (std::size_t i = 0; !str.empty() && i < str.size()-1; i += 2) {
//   ^^^^^^^^^^^        ^^^^^^^^^^^^        ^^^^^^^^^^^^   ^^^^^
    std::swap(str[i], str[i + 1]);
}

我认为您的目标是:

std::string str = "This is a simple string.";
for (int i = 0; i <= str.length()-2; i+=2) 
{
    std::swap(str[i], str[i + 1]);
}
std::cout << str;

有输出

hTsii  s aispmels rtni.g