Вставьте пробелы, чтобы разбить четные наборы символов в строке C ++ - PullRequest
2 голосов
/ 05 октября 2011

Я пытаюсь написать функцию, которая будет находить любые четные подмножества символов в строке и разбивать их пополам, вставляя в строку пустой пробел.Например, учитывая строку «AA BBB CCDD», моя строка должна быть преобразована в «AA BBB CC DD».

Моя функция breakString () не работает, и я понятия не имею, почему.Кто-нибудь может помочь?

void breakString(string &str1)
{
    int pos1 = -1;
    int pos2 = str1.find_first_of(" ", pos1+1);

    while (pos2 != -1)
    {
        if(((pos2-pos1)-1)%2 == 0)
        {
            str1.insert((pos2-pos1)/2, 1, ' ');
            return;
        }
        else
        {
            pos1 = pos2;
            pos2 = str1.find_first_of(' ', pos1+1);
        }
    }

    if((str1.size() - pos1)%2 == 1)     
        str1.insert((str1.length()-pos1)/2, 1, ' ');

    return;
}

Ответы [ 3 ]

1 голос
/ 05 октября 2011

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

(FWIW: Сначала я бы разбил всю строку на слова, положить их в std::vector<std::string>, а затем повторить, вставив дополнительное место, где это необходимо, затем соберите их. Это вероятно, немного медленнее, чем подход, который вы используете, но это много чище и легче следовать.)

0 голосов
/ 05 октября 2011
void breakString(string &str1){
    string::size_type pos1 = 0;
    string::size_type pos2 = str1.find_first_of(" ");

    while (pos2 != string::npos){
        if((pos2 - pos1) % 2 == 0){
            str1.insert(pos1 + (pos2-pos1)/2, 1, ' ');
            pos2 += 1;
        }

        pos1 = str1.find_first_not_of(" ", pos2);
        pos2 = str1.find_first_of(" ", pos1);
    }

    if((str1.size() - pos1) % 2 == 0)     
        str1.insert(pos1 + (str1.size() - pos1)/2, 1, ' ');

    return;
}
0 голосов
/ 05 октября 2011

В вашем цикле while есть возврат, поэтому после первой вставки он выйдет из функции.

...