Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/9: Рейтинг темы: голосов - 9, средняя оценка - 4.89
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
1

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

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

Author24 — интернет-сервис помощи студентам
вопрос: ввожу все строки и подстроки через gets, но когда начинается замена, пробелы не видит и удаляет по одному символу до пробела? как сделать чтобы пробелы все равно оставались в итоговой строке ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.02.2015, 00:37
Ответы с готовыми решениями:

Замена подстроки в строке с неизвестными символами в строке
Пример: есть строка: s="Делаешь, уешь, гниешь, ешь" Нужно заменить окончание ешь на ю ...

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

Замена подстроки в строке
строке имеются названия тригонометрических функций (sin, cos,tg,ctg). Нужно составить программу,...

Замена подстроки в строке
Добрый день. Есть строка $str="%str1 %str1 %str2 %str4 %str4 %str3 %str2"; В ней необходимо...

12
2 / 2 / 1
Регистрация: 06.02.2015
Сообщений: 19
09.02.2015, 03:03 2
Код покажите.
0
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
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
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
2 / 2 / 0
Регистрация: 26.10.2014
Сообщений: 44
11.02.2015, 23:58  [ТС] 6
Calendum, так вы мне не поможете?
0
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
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
Котовчанин
942 / 482 / 200
Регистрация: 16.02.2010
Сообщений: 3,338
Записей в блоге: 37
13.02.2015, 17:31 9
Алеекс, здесь с++.
0
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
13.02.2015, 21:04 10
Цитата Сообщение от miss-julia Посмотреть сообщение
я согласна поменять strtok на что нибудь другое, но, к сожалению, я не знаю на что...
Например, на std::regex_replace()
1
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
378 / 375 / 213
Регистрация: 29.03.2013
Сообщений: 867
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
5158 / 2770 / 465
Регистрация: 05.10.2013
Сообщений: 7,321
Записей в блоге: 147
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
16.02.2015, 17:23
Помогаю со студенческими работами здесь

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

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

Замена подстроки в строке
Приветствую! Имеется код, который работает set str1=У змеи кожа как у кожа крокодила...

Замена подстроки в строке
Не понимаю почему не работает, помогите пожалуйста. import random import math import string ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru