`std :: swap` не работает должным образом при манипулировании строками - PullRequest
3 голосов
/ 09 июня 2019

Я попытался сделать простое шифрование строк, меняя две последовательные буквы. И это не сработало так, как я собирался.

#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.

Ответы [ 2 ]

5 голосов
/ 09 июня 2019

Прежде всего, у вас есть доступ из-за

for (int i = 0; i <= str.length(); i++) 
//                ^^^^

, следовательно, поведение вашей программы не определено .Вы хотите перебрать один за другим размер строки.Кроме того, цикл выполняется только в том случае, если строка не пуста ( credits @ jww ).

Во-вторых, существует сравнение между int и unsigend int (т.е. str.length()) что тоже не нужно .

И последнее, но не менее важное: добавьте правильный заголовок для std::string (, как указал @PaulMcKenzie в комментариях ).

В целом, вы, вероятно, хотите это

#include <string>

for (std::size_t i = 0; !str.empty() && i < str.size()-1; i += 2) {
//   ^^^^^^^^^^^        ^^^^^^^^^^^^        ^^^^^^^^^^^^   ^^^^^
    std::swap(str[i], str[i + 1]);
}
4 голосов
/ 09 июня 2019

Я думаю, что вы стремитесь к чему-то вроде:

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
...