`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).
其次,比较int
和unsigend 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
我尝试通过交换两个连续的字母来进行基本的字符串加密。 它并没有真正按照我的预期工作。
#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).
其次,比较int
和unsigend 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