Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.03.2013, 16:50   #1
DeCIIoT
Пользователь
 
Регистрация: 20.10.2012
Сообщений: 21
По умолчанию Обработка строк. С++

Помогите поставить ограничители в программу:
1) программа должна читать первые 30 символов.
2) программа не должна читать знаки пунктуации.
3) программа должна перестать читать предложение после точки.
Вот мои наброски.
Код:
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <conio.h>
using namespace std;

int main()
{
	string str;
	getline(cin, str);

	vector<string> words;
	stringstream ss(str);
	copy(istream_iterator<string>(ss), istream_iterator<string>(), back_inserter(words));

	if (words.size() % 2 != 0)
		words.erase(words.begin() + words.size() / 2);

	copy(words.rbegin(), words.rend(), ostream_iterator<string>(cout, " "));
    getch();
	return 0;
}
DeCIIoT вне форума Ответить с цитированием
Старый 26.03.2013, 17:11   #2
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
1) программа должна читать первые 30 символов.
2) программа не должна читать знаки пунктуации.
Если знаки пунктуации не участвуют в лимите 30 символов, вместо getline используйте istream::get(), первую форму. Не существует готового вызова, который бы сочетал два таких требования, его надо собирать руками. Если имеется в виду, что читаются первые 30 символов, включая знаки препинания, но последние затем должны быть отброшены, используйте вторую форму istream::get().
Abstraction вне форума Ответить с цитированием
Старый 26.03.2013, 17:31   #3
DeCIIoT
Пользователь
 
Регистрация: 20.10.2012
Сообщений: 21
По умолчанию

а куда ее вписывать?
DeCIIoT вне форума Ответить с цитированием
Старый 26.03.2013, 17:55   #4
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
а куда ее вписывать?
Вопрос настолько сестра таланта, что я его не вполне понял. Вместо getline(cin, str); нужно собирать str более прихотливым образом, с использованием istream::get. Оба варианта, впрочем, всяко не сложнее приведённого Вами кода, так что проблем быть не должно.
Abstraction вне форума Ответить с цитированием
Старый 26.03.2013, 18:41   #5
DeCIIoT
Пользователь
 
Регистрация: 20.10.2012
Сообщений: 21
По умолчанию

я просто месяц как учусь на С++
так что еще не понимаю много.
DeCIIoT вне форума Ответить с цитированием
Старый 26.03.2013, 18:58   #6
DeCIIoT
Пользователь
 
Регистрация: 20.10.2012
Сообщений: 21
По умолчанию

вот я сделал чтоб 30 первых символов читало.
Код:
#include <iostream>
#include <sstream>
#include <vector>
#include <iterator>
#include <algorithm>
#include <conio.h>
using namespace std;

int main()
{    char m[30];
	string str;
	cin.getline(m,30);
    m[30]='\0';
    str=m;
	vector<string> words;
	stringstream ss(str);
	copy(istream_iterator<string>(ss), istream_iterator<string>(), back_inserter(words));

	if (words.size() % 2 != 0)
		words.erase(words.begin() + words.size() / 2);

	copy(words.rbegin(), words.rend(), ostream_iterator<string>(cout, " "));
    getch();
	return 0;
}
DeCIIoT вне форума Ответить с цитированием
Старый 26.03.2013, 23:47   #7
Abstraction
Старожил
 
Аватар для Abstraction
 
Регистрация: 25.10.2011
Сообщений: 3,178
По умолчанию

Цитата:
я просто месяц как учусь на С++
так что еще не понимаю много.
Но понимаете достаточно, чтобы понять и использовать конструкцию вида copy(istream_iterator<string>(ss), istream_iterator<string>(), back_inserter(words))? Неплохо для одного месяца и свидетельствует о вполне приличном уровне, так что незачем разжёвывать мелкие детали. Странно, что допускаете такие ляпы:
Код:
    m[30]='\0';
Если нужно считать 30 символов со знаками препинания - читаем istream::get(char*, streamsize, char), не забыв про место под нуль-терминатор в буфере; выкидываем знаки препинания, натравив std::remove (пример); дальше как у Вас.

Если нужно читать 30 символов без учёта знаков препинания - я бы читал посимвольно (возможно, вынеся код чтения в отдельную функцию). Можете попробовать решить задачу элегантно с использованием вот этих ломиков, но тут уж на Ваш страх и риск.
Abstraction вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Обработка строк hartman Помощь студентам 1 26.12.2012 22:56
Обработка строк m-o-r-t-r-o-m Помощь студентам 3 18.05.2010 17:14
Обработка строк Vad56 Помощь студентам 1 03.12.2009 23:26
обработка строк на Си HoOpe Помощь студентам 35 20.05.2009 19:11
обработка строк densan Общие вопросы Delphi 3 26.08.2008 11:11