Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
miss-julia
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
1

Замена подстроки в строке (с пробелами)

09.02.2015, 00:37. Просмотров 822. Ответов 12
Метки нет (Все метки)

вопрос: ввожу все строки и подстроки через gets, но когда начинается замена, пробелы не видит и удаляет по одному символу до пробела? как сделать чтобы пробелы все равно оставались в итоговой строке ?
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.02.2015, 00:37
Ответы с готовыми решениями:

Замена подстроки в строке
В строке нужно заменить подстроку aaa на 3(a). Помогите написать код без...

Замена подстроки в строке
Так как не нашел алгоритм стемминга для C++, то пришлось что-то придумывать...

Замена подстроки в строке
здесь у меня такая проблема возникла мне нужно заменить все "were" на "are" но...

Замена подстроки в строке
Дана строка. Заменить все подстроки “xz2” на запятые без подключения...

Замена подстроки в строке (аналог str_replace)
Здравствуйте. С++ познаю недавно и порой ставят в ступор довольно таки...

12
Calendum
2 / 2 / 1
Регистрация: 06.02.2015
Сообщений: 19
09.02.2015, 03:03 2
Код покажите.
0
miss-julia
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
09.02.2015, 18:15  [ТС] 3
Calendum,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include "stdafx.h"
#include "iostream"
#include <string.h>
using namespace std;
 
int _tmain(int argc, _TCHAR* argv[])
{ setlocale(LC_ALL,"russian");
  char str[100]={NULL},str1[100]={NULL},str2[100]={NULL}, str3[100]={NULL}, str4[100]={NULL};
  char *ind, *ind1;
  cout<<"введите строку:"<<endl;
  gets(str);
  cout<<"введите строку для поиска:"<<endl;
  gets(str1);
  if(strstr(str,str1)==NULL){cout<<"нет совпадений"<<endl;}else
  {
  cout<<"введите строку для замены:"<<endl;
  gets(str2);
  ind=strtok(str,str1);
  ind1=strtok(0,str1);
 
  for(int i=0;i<strlen(ind);i++)
     { str3[i]=ind[i];}
  
  for(int j=0;j<strlen(ind1);j++)
  {str4[j]=ind1[j];}
  cout<<str3<<"  "<<str2<<"   "<<str4<<endl;
  strcat(str3,str2);
  
  strcat(str3,str4);
 
  cout<<"итог: "<<str3<<endl;}
  system("pause");
    return 0;
}
0
Calendum
2 / 2 / 1
Регистрация: 06.02.2015
Сообщений: 19
10.02.2015, 04:00 4
miss-julia,

Я правильно понимаю?
Нужно на введенные строки:
Код
"Наша Маша хороша"
"Маша"
"Юля"
Получить ответ:
Код
"Наша Юля хороша"
А получается:
Код
"НашаЮляхороша"
Тогда может в 27-29 строках Вашего листинга, попробовать так:
C++
1
2
3
4
strcat(str3," ");
strcat(str3,str2);
strcat(str3," ");  
strcat(str3,str4);
Просто функция strtok() - э... специфичная. Её по условию задания нужно использовать или это Ваша импровизация?
0
miss-julia
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
10.02.2015, 22:42  [ТС] 5
Calendum, эх..моя импровизация, по-другому увы не догадалась. но проблема в другом.
пример 1
строка-privet kak dela
подстрока -kak
замена-chto
итог- privet kak del
не хватает последней буквы del почему то.. такое происходит только если есть пробелы
пример 2
строка-iuuhef dkd fjdbnv dv
подстрока-jdbn
замена-oo
итог-iuuhef ook
от куда эта к? и почему там ни пробела ни букв нормальных?
я согласна поменять strtok на что нибудь другое, но, к сожалению, я не знаю на что...
0
miss-julia
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
11.02.2015, 23:58  [ТС] 6
Calendum, так вы мне не поможете?
0
Людвиг Бодмер
357 / 356 / 211
Регистрация: 29.03.2013
Сообщений: 867
Завершенные тесты: 4
12.02.2015, 22:03 7
miss-julia, по-моему с помощью strtok() делать - плохая идея. Как вам вот такой вариант (функцию подсмотрел на stackoverflow):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include "iostream"
#include <string>
using namespace std;
 
bool replace(std::string& str, const std::string& from, const std::string& to) {
    size_t start_pos = str.find(from);
    if(start_pos == std::string::npos)
        return false;
    str.replace(start_pos, from.length(), to);
    return true;
}
 
 
 
int _tmain(int argc, _TCHAR* argv[])
 {
   setlocale(LC_ALL,"russian");
   std::string str,str1,str2;
   cout<<"введите строку:"<<endl;
   std::getline(std::cin, str);
   cout<<"введите строку для поиска:"<<endl;
   std::getline(std::cin, str1);
   if(str.find(str1)==std::string::npos) 
    {
      cout<<"нет совпадений"<<endl;
    }
   else
    {
      cout<<"введите строку для замены:"<<endl;
      std::getline(std::cin, str2);
      replace(str, str1, str2);  
      cout<<"итог: "<<str<<endl;
    }
   system("pause");
   return 0;
 }
1
Алеекс
2 / 2 / 1
Регистрация: 23.10.2014
Сообщений: 55
13.02.2015, 17:01 8
Ребята, а можете то же на Паскале?
0
Тамика
Котовчанин
928 / 469 / 199
Регистрация: 16.02.2010
Сообщений: 3,304
Записей в блоге: 29
13.02.2015, 17:31 9
Алеекс, здесь с++.
0
8Observer8
2320 / 1480 / 245
Регистрация: 05.10.2013
Сообщений: 4,619
Записей в блоге: 58
13.02.2015, 21:04 10
Цитата Сообщение от miss-julia Посмотреть сообщение
я согласна поменять strtok на что нибудь другое, но, к сожалению, я не знаю на что...
Например, на std::regex_replace()
1
miss-julia
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
14.02.2015, 21:30  [ТС] 11
Людвиг Бодмер, а не могли бы вы объяснить как работает функция? ибо все что я так увидела, ничего не знаю... 2 курс...

Добавлено через 33 минуты
Людвиг Бодмер, хотя нет.
C++
1
str.replace(start_pos, from.length(), to);
скорее не понятно что передается первое и второе?

Добавлено через 17 секунд
даже просто второе...

Добавлено через 51 секунду
можно как то этой функцией не пользоваться?
0
Людвиг Бодмер
357 / 356 / 211
Регистрация: 29.03.2013
Сообщений: 867
Завершенные тесты: 4
16.02.2015, 11:00 12
miss-julia,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool replace(std::string& str, const std::string& from, const std::string& to) { 
    size_t start_pos = str.find(from); // находим позицию первого символа искомой подстроки в строке
    if(start_pos == std::string::npos) // если позиция символа равна концу строки
        return false;  // выходим из функции
    str.replace(start_pos, from.length(), to); 
    /* Функция "replace" заменяет часть строки, которая начинается с символа "start_pos" и имеет 
    длину "from.length()". Заменяет на строку "to".
        На примере "privet kak dela" , "kak", "chto" :
    size_t start_pos = str.find(from); Находится позиция первого символа, с которого начинается 
        подстрока "kak" в исходной строке, т.е. "k" в строке "privet kak dela", получается "7"
    str.replace(start_pos, from.length(), to); Функция получит такие значения параметров:
        str.replace(7, 3, "chto"), т.е. в строке "str", начиная с седьмого символа следующие три 
        символа заменятся на строку "chto"  */
    return true;
}
Примерно так, надеюсь нигде не наврал

Добавлено через 29 минут
miss-julia, можно сделать в си-стиле , что-то вроде такого (снова со stackoverflow):
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
char *replace_str(char *str, char *orig, char *rep, int start)
{
  static char temp[4096];
  static char buffer[4096];
  char *p;
 
  strcpy(temp, str + start);
 
  if(!(p = strstr(temp, orig)))  // Is 'orig' even in 'temp'?
    return temp;
 
  strncpy(buffer, temp, p-temp); // Copy characters from 'temp' start to 'orig' str
  buffer[p-temp] = '\0';
 
  sprintf(buffer + (p - temp), "%s%s", rep, p + strlen(orig));
  sprintf(str + start, "%s", buffer);    
 
  return str;
}
Добавлено через 1 минуту
Ну и std::regex_replace() да, отличный вариант, если компилятор поддерживает
1
8Observer8
2320 / 1480 / 245
Регистрация: 05.10.2013
Сообщений: 4,619
Записей в блоге: 58
16.02.2015, 17:23 13
Посмотрите, как вам мой код. Может замечания какие будут по улучшению:

main.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <iostream>
#include <string>
#include "functions.h"
 
int main()
{
    // Input
    std::string text = "A good day";
    std::cout << "Original text: " << text << std::endl;
 
    // Replace
    std::string from = "good";
    std::string to = "very nice";
    if ( !replace( text, from, to ) )
    {
        std::cerr << "Error: unable to replace" << std::endl;
        return 1;
    }
 
    // Output
    std::cout << "Output text: " << text << std::endl;
 
    return 0;
}
functions.h
C++
1
2
3
4
5
6
7
8
9
10
#ifndef FUNCTIONS
#define FUNCTIONS
 
#include <string>
 
bool replace( std::string &text,
              const std::string &from,
              const std::string &to );
 
#endif // FUNCTIONS
functions.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include "functions.h"
#include <regex>
#include <string>
 
bool replace( std::string &text,
              const std::string &from,
              const std::string &to )
{
    try {
        std::regex r( from );
        text = std::regex_replace( text, r, to );
    }
    catch( const std::regex_error &e )
    {
        return false;
    }
 
    return true;
}
1
16.02.2015, 17:23
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.02.2015, 17:23

Поиск подстроки в строке и замена её на другую строку
Подскажите пожалуйста как мне поправить ошибку? Написал такую функцию. Всё...

Функция: замена подстроки в строке на заданную строку
Помогите пожалуйста с данной задачей: Реализовать на языке C функцию замены...

Найти длину максимальной подстроки, такой что в этой подстроке не существует подстроки равной какой-то строке
Не могу решить задачу, я понял саму задачу. Не могу написать код, помогите,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru