Вставить символ в строку - PullRequest
0 голосов
/ 10 ноября 2018

Мне нужно вставить символ в строку в каждом экземпляре этого символа. Например, если моей строкой было «Это тест», а моим символом было «s», мой вывод должен выглядеть так: «Это тест»

есть идеи, почему это не работает? Вот что у меня так далеко. Я не должен добавлять какие-либо дополнительные инструкции препроцессора или что-то еще, просто используя то, что здесь, мне нужно это выяснить.

#include <iostream>
#include <string>
using namespace std;

int main(){

    string userString;
    char userChar;

    cin >> userString;
    cin >> userChar;

    for (int i = 0; i < userString.size(); i++){
        if(userString.at(i) == userChar){
            userString.insert(userString.begin() + i, userChar);
        }
    }
    cout << userString;

    return 0;

Обновление:

Вот решение, которое я разработал.

#include <iostream>
#include <string>
using namespace std;

int main(){

    string userString;
    char userChar;
    cout << "enter a string" << endl;
    getline(cin, userString);
    cout << "enter a character" << endl;
    cin >> userChar;

    for (int i = userString.size()-1; i >= 0; i--){
        if(userString.at(i) == userChar){
            userString.insert(userString.begin() + i, userChar);
        }
    }
    cout << userString;
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

Ваше первое решение, вероятно, заканчивается бесконечным циклом, если вы когда-нибудь найдете одного из выбранных символов, потому что вы всегда вставляете еще одну копию вперед и продолжаете находить один и тот же символ когда-либо после.

std :: basic_string имеет функцию поиска. Всегда лучше использовать код, предлагаемый библиотекой, чем самодельный код. Вот мое предлагаемое решение:

std::string& duplicate_char(std::string& str, char val)
{
    using std::string;

    auto pos  = str.find(val); // finds first index of character val or npos if unsuccessful
    while (pos != string::npos)
    {
        str.insert(pos, 1, val); // insert at pos one character val
        pos = str.find(val, pos + 2); // find the next occurence of val starting after the newly inserted character
    }

    return str;
}

Вы можете использовать эту функцию следующим образом:

int main()
{
    std::string testStr{"Thiss iss a tesst"};
    duplicate_char(testStr, 's');

    std::cout << testStr << std::endl;
}
0 голосов
/ 10 ноября 2018

Я не знаю, почему вы хотите пройти через строку назад. Тем не мение. Ваша проблема в том, что после того, как вы вставите символ в какую-то позицию, ваш цикл встретит вставленный символ снова на следующей итерации и вставит другой. До бесконечности.

#include <cstddef>  // std::size_t, the correct type for indexes and sizes of objects in mem
#include <string>
#include <iostream>

int main()
{
    std::cout << "Enter a string: ";
    std::string userString;               // define variables as close
    std::getline(std::cin, userString);

    std::cout << "Enter a character: ";
    char userChar;                        // to where they're used as possible
    std::cin >> userChar;

    for (std::size_t i{}; i < userString.size(); ++i) {
        if (userString[i] == userChar) {  // no need to use std::string::at() 1)
            userString.insert(userString.begin() + i, userChar);
            ++i;  // advance the index to not read the same character again.
        }
    }

    std::cout << userString << '\n';
}

1) поскольку он уже уверен, что индекс будет в допустимом диапазоне.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...