Форум программистов, компьютерный форум CyberForum.ru

Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д - C++

Восстановить пароль Регистрация
 
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 17:59     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #1
Помогите, пожалуйста решить задачку с использованием класса string. Я только учусь, и меня пока плохо получается..
Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д.
Вот мои наработки.. Но программа зациклилась и всё убила, пришлось перезапускать компьютер.
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 <iostream>
#include <cstdlib>
#include <conio.h>
#include <string>
using namespace std;
 
int main()
{
    string str, temp, firstWord, secondWord, general;
    string::size_type k = 0, position = 0;
    string separator = ",.:;!? ";
    cout << "Enter string: ";
    getline(cin, str);
    
    k = str.find_first_of(separator, position);
    while(k!=string::npos)
    {
        firstWord = str.substr(position, k-position);
        if(ispunct(str[k]))
            position = k+2;
        else position= k+1;
        secondWord = str.substr(position, k - position);
        if(ispunct(str[k]))
            position = k + 2;
        else position = k + 1;
        temp = firstWord;
        firstWord = secondWord;
        secondWord = temp;
        str.erase(position, k);
        general = firstWord + secondWord;
        str.insert(k , general);
    }
 
    cout <<"Changed string: " << str;
    getch();
    return 0;
}
Добавлено через 20 минут
Забыл дописать! Сообщение содержит знаки препинания, пробелы, то есть осмысленный текст, в котором также могут встречаться цифры.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.08.2013, 17:59     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д
Посмотрите здесь:

Дана строка. Поменять местами первое слово со вторым, третье с четвертым и т.д. C++
C++ Поменять слова в сообщении (строки)
Поменять слова в сообщении по принципу: первое с последним, второе с предпоследним и т.д. C++
C++ Поменять местами в строке первое и последнее слова
C++ Дан массив. Поменять местами его первый элемент со вторым, третий - с четвертым и т.д.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.08.2013, 18:07     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #2
Да строку разбей на слова, слова в массив сохрани и в цикле уже так как нужно этот массив обработай. От допустим у нас 10 слов, делим слов цикл будет от нуля до 5 for(int i=0;i<5;i++).
Меняй местами элементы массива
C++
1
2
3
4
5
6
7
int k=9;
for(int i=0;i<5;i++)
{
string temp=mass[i];
mass[i]=mass[k];
mass[k]=temp;
k--;
Дальше массив в строку переводишь и все.
}
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 18:19  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #3
ninja2, а какой массив мы переводим в строку?
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
16.08.2013, 18:19     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #4
Цитата Сообщение от ninja2 Посмотреть сообщение
C++
1
2
3
4
5
6
7
int k=9;
for(int i=0;i<5;i++)
{
    string temp=mass[i];
    mass[i]=mass[k];
    mass[k]=temp;
    k--;
}
Здесь происходит обмен местами 1-го и последнего, 2-го и предпоследнего, А нужно 1-го и 2-го, 3-го и 4-го
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 19:42  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #5
BigLow, точно...
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.08.2013, 20:24     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #6
BigLow, Да чото подумал первое с последним, второе с предпоследним ошибся чуток. Тогда РВ проще использовать.

Darren_Clyde, От тебе мое элегантное решение:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
using std::cout;
using std::endl;
#include <string>
using std::string;
#include <regex>
using std::regex;
using std::regex_replace;
 
int main()
{
    string str="hellow world gacpada da eb";
    regex rv(" *([^ ]*) ([^ ]*) *");
    string result=regex_replace(str,rv,string("$2 $1 "));
    cout <<str<<endl;
    cout <<result<<endl;
 
    return 0;
}
Добавлено через 4 минуты
Решение в 10 строк
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <string>
#include <regex>
int main()
{
    std::string str="hellow world gacpada da eb";   
    std::string result=std::regex_replace(str,std::regex(" *([^ ]*) ([^ ]*) *"),std::string("$2 $1 "));
    std::cout <<str<<std::endl; std::cout <<result<<std::endl;
    return 0;
}
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 21:51  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #7
ninja2, а как нам сделать, чтобы пользователь сам вводил сообщение?
Я пробую:
C++
1
getline(cin, str);
Он пишет ошибка. В чем может быть проблема?
BigLow
55 / 55 / 2
Регистрация: 07.07.2013
Сообщений: 345
16.08.2013, 21:54     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #8
Darren_Clyde, а какая ошибка?
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 21:57  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #9
ninja2, Я разобрался))) Пространство имен)) нужно было определить getline и cin в данном случае. Спасибо огромное за помощь, я очень благодарен!!
А возможно осуществить тоже самое, избегая регулярных выражений? просто боюсь такое решение мне не зачтут ( хотя оно и продуктивнее..
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.08.2013, 22:19     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #10
Darren_Clyde, можно с помощью функций substr, replace и find или if_find, короче это очень морочно, рв сила.

Добавлено через 1 минуту
Или что бы не мучится разбей строку на слова, запиши их в массив и в массиве уже поменяй нужные слова, а потом слова из массива в строку скопируй.
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 22:37  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #11
ninja2, объясните, пожалуйста, регулярное выражение, которое вы использовали
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
16.08.2013, 23:49     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #12
Darren_Clyde, Отета от фигня [^ ]* соответствует любому количеству символов кроме пробела.
пробел и звездочка означает что может быть любое количество пробелов, а может быть и ни одного пробела, то что находится в скобках соответсвует любому слову ([^ ]*) между ними пробел, хотя можно было и наверно нужно поставить пробел и звездочку между ними и после последнего звездочка.
Почитай про рв там просто.
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
16.08.2013, 23:51  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #13
ninja2, спасибо огромное!!!
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 00:02     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #14
Darren_Clyde, Еще про скобки, это скобки сохраняющие то что у нас двое пар сохраняющих скобок и мы можем использовать то что в них сохраняется в regex_replace это переменные $1 и переменная $2 просто меняем местами в выражении "$2 $1 " и все дела, еще есть переменная $0 в ней сохраняется вся строка которая соответствует данному выражению.

Добавлено через 3 минуты
можешь поэксперементировать в regex_replace "$2 $1 " заменить например на "[$0] [$1] [$2] " и посмотреть что получится.
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
17.08.2013, 17:09  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #15
ninja2, как я понял:
C++
1
 regex rv(" *([^ ]*) /* <- Эта часть означает наше первое слово*/ ([^ ]*) /* <- А эта по сути второе*/ *");
Я не понимаю, что означают звездочки слева и справа от двух скобок, если не сложно поставьте комментарии в коде, а то до меня не доходит..
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 19:14     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #16
Там пробел и звездочка ' *' означает что перед словом может быть пробелы, а может и не быть, и после двух слов могут быть пробелы а могут не быть. А от если б был бы там пробел и знак вопроса, ' ?' то это означает что полюбому должен быть хоть один пробел.
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
17.08.2013, 20:23  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #17
ninja2, спасибо! Я теперь понял. А пробел между двумя скобками (словами) играет какую-то роль?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
17.08.2013, 20:39     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #18
Цитата Сообщение от Darren_Clyde Посмотреть сообщение
ninja2, спасибо! Я теперь понял. А пробел между двумя скобками (словами) играет какую-то роль?
Ну у тебя ж в тексте идет слово1 слово2 слово3 слово4 . Между слово1 и слово2 у тебя стоит пробел?. Вообще между скобками лучше поставить пробел и знак вопроса ' ?' отак чтобы обязательно был хотябы один пробел или болше, там 4 пробела мб ты случайно поставишь. Есть в РВ специальные символы \w соответсвует любому символу, и \p или я не помню точно нужно смотреть соответсвует любому пробельному символу, мб знак табуляции пробел. Я щас не сильно помню это нужно смотреть литературу по РВ и пытаться на практике делать.
Короче экспериментировать нужно.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.08.2013, 20:47     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д
Еще ссылки по теме:

Поменять первый элемент со вторым,третий с четвертым и т.д C++
поменять местами первое и последние слова C++
Поменять местами первое и последнее слова в строке C++

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

Или воспользуйтесь поиском по форуму:
Darren_Clyde
 Аватар для Darren_Clyde
1 / 1 / 0
Регистрация: 05.04.2013
Сообщений: 27
17.08.2013, 20:47  [ТС]     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д #19
ninja2, спасибо огромное!!
Yandex
Объявления
17.08.2013, 20:47     Поменять слова в сообщении по принципу: первое со вторым, третье с четвертым и т.д
Ответ Создать тему
Опции темы

Текущее время: 17:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru