Как я могу создать цикл, который вставляет символ после нахождения конкретного символа в строке? - PullRequest
1 голос
/ 15 октября 2019

я пытаюсь создать цикл, который вставляет пробел после каждой итерации периода из введенной строки. когда я использую оператор if, он изменяет только первый экземпляр. я не знаю, как создать цикл, который будет проверять каждый период, а затем вставлять пробел.

Я попытался создать функцию с циклом while, но он продолжает работать бесконечно.

void myfunc(string &s) {

int pos = s.find('.');
if (pos != string::npos) {
pos = s.find('.', pos + 1);
s.insert(pos,"  ");


} 
cout << s;

Я ожидаю пробел после итерации периода, но, к сожалению, он изменяется только после нахожденияпервая итерация такая.

Ответы [ 3 ]

0 голосов
/ 15 октября 2019

Вы были очень близки в своем мышлении. Единственное, чего вам не хватало, - это цикла для реализации вставки для каждого '.', найденного в вашей строке. Цикл for идеально подходит для этого, например,

void myfunc (std::string& s)
{
    /* loop finding each '.' insert ' ' after (except at end) */
    for (size_t pos = s.find('.');
            pos != std::string::npos; 
            pos = s.find('.', pos + 1)) {
        if (pos + 1 != s.length())      /* don't insert ' ' at end of s */
            s.insert (pos + 1, " ");
    }
}

( примечание: нет необходимости вставлять ' ' в самый конец строки, поэтому проверьтеif (pos + 1 != s.length()) используется для проверки того, что вы не в конце, прежде чем вставка будет выполнена)

В целом, в полном примере вы можете сделать:

#include <iostream>
#include <string>

void myfunc (std::string& s)
{
    /* loop finding each '.' insert ' ' after (except at end) */
    for (size_t pos = s.find('.');
            pos != std::string::npos; 
            pos = s.find('.', pos + 1)) {
        if (pos + 1 != s.length())      /* don't insert ' ' at end of s */
            s.insert (pos + 1, " ");
    }
}

int main (void) {

    std::string s {"look.run.see."};
    std::cout << "original: " << s << '\n';

    myfunc (s);

    std::cout << "modified: " << s << '\n';
}

Пример использования /Выходные данные

$ ./bin/stringinsert
original: look.run.see.
modified: look. run. see.

Это не единственный способ сделать это, но очень простой.

0 голосов
/ 15 октября 2019
#include <iostream>
#include <string.h>
#include <stdio.h>
using namespace std;

int main()
{
   string str="look.run.see.";
   for(int i=0; i< str.size()-1;i++)
   {
    if((str[i]=='.') && (str[i+1] != ' '))
    {
        str=str.substr(0,i+1)+" "+str.substr(i+1,str.size()-1);
    }
   }
   cout<<str;
  return 0;
}

Это в основном проверяет строку, имеет ли она точку, и проверяет, не добавляет ли она пробел в конце строки или если после нее уже есть пробел. Это может помочь?

0 голосов
/ 15 октября 2019

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

#include <string>
#include <algorithm>
#include <cassert>

int main() {
    auto s = std::string {"test.string.here." };
    auto it = s.begin();
    while ((it = std::find(it, s.end(), '.')) != s.end()) {
        it = s.insert(it+1, ' ') + 1;
    }
    assert(s == "test. string. here. ");
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...