WedX - журнал о программировании и компьютерных науках

Замена всех вхождений одной строки другой в потоке текста

Как следует из названия, как заменить строку другой строкой? Например: пользователь должен ввести три входа. Первый ввод — это строка, которую программа заменит; вторая — строка, которая заменит input1; и третья строка, которая будет распечатана. Так что если:

Input1 = арахис

Input2 = кокос

Input3 = заменитьарахисзаменить

Вывод: заменитькокосзаменить

Я запустил его, но моя программа может заменять только слова одинаковой длины. Я попытался найти свою проблему, но я не понимаю данных решений, так как я просто новичок в C/C++.

char replacing[100];
char replacement[100];
char original[1000];
int count;

cin >> replacing;
cin >> replacement;

while(! cin.eof())
{
    cin >> original;

    char * pch;


    pch = strstr (original, replacing);

    count = strlen(replacement);
    strncpy (pch, replacement, count);


    cout << original << endl;

}
25.07.2017

  • Если вы хотите изучать C++, пожалуйста, идите и изучайте C++. С вашей проблемой можно ознакомиться здесь. Если вы хотите изучить C, пожалуйста, изучайте только C и смотрите, что делает strncpy. Не смешивайте это. Таким образом, вы в конечном итоге сделаете это неправильно в обоих случаях. 25.07.2017
  • Попробуйте использовать std::string. Он имеет функцию-член для поиска подстроки и замены ее частей. И это легко прочитать из входного потока. 25.07.2017
  • Вас также может заинтересовать Почему iostream::eof внутри условия цикла считается неверным? 25.07.2017
  • Мы еще не рассмотрели std::string в классе, поэтому я не знаю, как их использовать. Я попытаюсь изучить это все же. Спасибо 25.07.2017

Ответы:


1

Что о:

  • Сначала вы находите (если есть) вхождение этой строки
  • Используйте замену, чтобы заменить вхождение второй строкой

Вот что должно работать:

    bool replaceFirst(string& input, const std::string& toBeReplaced, const std::string& replacement) {
    size_t start_pos = input.find(toBeReplaced);
    if(start_pos == std::string::npos)
        return false; //substring not found! 

    input.replace(start_pos, toBeReplaced.length(), replacement); //found. now i can replace!
    return true;
}

Поскольку вы используете массив символов вместо string, вы должны убедиться, что замена не выведет вас за пределы (строки автоматически изменяют размер для вас).

25.07.2017
  • from, похоже, не определено в вашем примере кода. 25.07.2017
  • @AlgirdasPreidžius исправлено. 25.07.2017
  • Проблема осталась: str.find(from);. 25.07.2017

  • 2

    Основная проблема заключается в том, что strncpy не выделяет (или не освобождает) никакой памяти. Это означает, что если replacement короче, чем replacing, часть replacing не будет перезаписана. Точно так же, если replacement длиннее, он будет перезаписан после конца replacing.

    Как уже было сказано, лучше использовать std::string (или какой-нибудь другой строковый класс C++, такой как Qt QString, если Qt вам по душе) .

    Еще одна мелочь, вообще со стримами лучше не просто проверять на eof, а писать что-то вроде

    while (cin >> original) {
    

    Это завершится, если поток находится в любом состоянии отказа, а не только в eof.

    25.07.2017
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: [email protected]