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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.03.2010, 20:08   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Мучения со строкой

Я уже усилено мусолил эту тему в предыдущем разделе, на там была другая тонкость. Суть заключается в следующем - я хочу вводить несколько слов в ОДНУ строку типа string, да ещё чтобы в этой строке можно было анализировтаь команды.
То есть есть стринговая переменная, и я ввожу в неё команду:

возьми гитару или иди на восток

И теперь бы неплохо, чтобы моя функция анализа могла находить в этой строке слова "возьми" и "гитара". Функции для работы строк не подходят из-за формата, ну а метод string.compare не желает делать того, чего хочу я.

Код:
string take = "возьми",
       guitar = "гитара"; 
string command;
cin >> command;
Analysis(command);
//-----------------
Analysis(string command){
if(!command.compare(0,16,take,0,6)) cout << "Что взять?";
else cout << "Команда не распознана";
}
Выполняется условие else. В принципе, оно и не удивительно: сравнивать 16 символов из command с 6-ю символами из take... Уже по размеру не подходит. 16 символов потому, что command в случае успеха должна передаваться функции take, которая там же отыщет слово guitar

Вот и склоняюсь перед вашей мудростью в очередной раз: есть ли чистые и элегантные способы вводить и анализировать целую строку?

Последний раз редактировалось Кипящий чайник; 07.03.2010 в 20:28.
Кипящий чайник вне форума Ответить с цитированием
Старый 07.03.2010, 20:13   #2
Ozerich
Студент 1 курса
Форумчанин Подтвердите свой е-майл
 
Аватар для Ozerich
 
Регистрация: 27.06.2008
Сообщений: 959
По умолчанию

Считывать целую строку, а не одно слово можно с помощью getline
C++(STL, QT, WinInet) / DHTML(CSS) / JavaScript / PHP Developer
Ozerich вне форума Ответить с цитированием
Старый 07.03.2010, 20:52   #3
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Как сказали выше, для чтения строки можно использовать функцию std::getline.
Для разбиения строки на слова в стиле cin (istream) можно использовать stringstream.
Для поиска подстроки в строке можно использовать метод класса string - find.
std::getline
std::stringstream
std::string
Также, если есть желание или необходимость работать с С-ми функциями, то можно получать представление string в виде С-строки. Для этого вызывайте метод c_str()
netrino вне форума Ответить с цитированием
Старый 07.03.2010, 22:52   #4
artush1984
Форумчанин
 
Аватар для artush1984
 
Регистрация: 27.04.2009
Сообщений: 184
По умолчанию

а тут надо string или wstring ?
Hа C я могy пpосто делать ошибки, на C++ я могy их наследовать!
artush1984 вне форума Ответить с цитированием
Старый 12.03.2010, 06:41   #5
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Ответ я нашёл, в принципе сам, подумав хорошенько, а потом ещё раза три.
Вот, предположим, введённая строка:

"возьми гитару"

В слове возьми насчитывается шесть символов.
Так вот, пусть функция Analysis при помощи compare сравнит первые шесть символов команды с шестью символами переменной take = "возьми". И если соответствие найдено, но учитываем пробел, и начинаем искать второе слово уже не с восьмого слова таким же образом.
Банальная арифметика, но работает. Как вы это находите? Достаточно элегантно?
Кипящий чайник вне форума Ответить с цитированием
Старый 12.03.2010, 09:26   #6
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

А вам, собственнно, обязательно нужно чтобы было "Элегантно"?
А если я скажу, что нет - то что вы будете делать, еще искать пути решения?
Я так понимаю код пишется для себя, элегантно или не элегантно тут по крайней мере в быстродействии роли не сыграет, так что по этому поводу лучше не париться...По крайней мере если вас затрудняют такие несложные вопросы
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 12.03.2010, 18:27   #7
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

А если я напишу
Код:
"    возьми гитару" (обратите внимание на пробелы)
? )
Пожалуй, наиболее верным решением будет, всё же, разбивать строку на составляющие, и анализировать их отдельно.
netrino вне форума Ответить с цитированием
Старый 18.03.2010, 13:17   #8
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Благослови тебя Бог, сын мой. Мне и правда очень помогла find, описанная в примере. Я немного упростил его - и вуаля! Спасибо!
Кипящий чайник вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
работа со строкой Андрей.12 Помощь студентам 1 15.02.2010 09:14
Работа со строкой!!! APTEMUC Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 0 18.01.2010 00:22
Работа со строкой s2dentishe Общие вопросы Delphi 6 05.12.2009 15:09
работа со строкой. D_E_N Общие вопросы Delphi 4 25.10.2009 16:19
Программа со строкой. XaMeJleoH Паскаль, Turbo Pascal, PascalABC.NET 0 26.05.2009 21:48