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

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

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

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

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

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

Все проблемы текстового квеста растут из ввода команд. Как показала практика, использование двух переменных - очень неудобно:
Код:
 
wchar_t p1[16],p2[16];
wscanf("%S%S", p1,p2);
Введённая информация может воообще не записаться в переменную, всё может записаться в одну переменную, а другую оставить пустой, а может работать, как часы - в общем, делает, что хочет.
Я попробовал использовать одну переменную, вводил её при помощи wcin.getline(p1,99).
Вот я ввожу команду:
возьми гитару
"возьми" и "гитара" - такие символьные переменные есть.
Это всё сохраняется в одной переменной, и функция wcsncmp(part1,take,4) видит слово "возьми", слава Богу, однако wcsncmp(part1,guitar,4) слово "гитару" не видит в упор, и, как результат, работа стопорится.
Не подскажете, как же всё-таки грамотно построить алгоритм анализа?

Последний раз редактировалось Кипящий чайник; 20.02.2010 в 20:03.
Кипящий чайник вне форума Ответить с цитированием
Старый 20.02.2010, 18:40   #2
RoS
Форумчанин
 
Аватар для RoS
 
Регистрация: 13.12.2009
Сообщений: 272
По умолчанию

Используй юникодный вариант функции strtok, ну или wcstok, она разбивает исходную на подстроки, примеры ищи где-нибудь
Я лишь дал пищу для гугля
Если я помог вам - порадуйте меня, нажмите на весы слева
RoS вне форума Ответить с цитированием
Старый 20.02.2010, 20:00   #3
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

К сожалению, паства на гугле дала скудные результаты - в частности, примеры были устаревшими и не компилировались из-за ошибок.
Так что, видимо, всё же придётся вам подкинуть парочку примеров чайнику.

Последний раз редактировалось Кипящий чайник; 21.02.2010 в 10:59.
Кипящий чайник вне форума Ответить с цитированием
Старый 21.02.2010, 12:26   #4
Olejik
Форумчанин
 
Регистрация: 02.06.2009
Сообщений: 218
По умолчанию

пример в msdn'е есть на счет strtok, там свежачок и все компилится
Olejik вне форума Ответить с цитированием
Старый 21.02.2010, 12:37   #5
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Ну, там же strtok, а wcstok таки да отличается от strtok дополнительным параметром, и соответсвенно, манерой использования...

Последний раз редактировалось Кипящий чайник; 21.02.2010 в 12:39.
Кипящий чайник вне форума Ответить с цитированием
Старый 21.02.2010, 14:13   #6
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Я всё же не пойму, почему вы не используете стандартную библиотеку Си++? Это ведь намного удобнее, проще и меньше вероятность ошибки
Код:
string command, object;

cin >> command >> object;
if(command == "гитара")
// ...
в качестве разделителя принимается пробел или перенос строки.
или, если уж на то пошло, то wcstok и strtok имеют одинаковое кол-ство параметров.
http://msdn.microsoft.com/ru-ru/library/2c8d19sb.aspx
netrino вне форума Ответить с цитированием
Старый 21.02.2010, 15:16   #7
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Ну, на первый вопрос ответить просто - я этакий олдфаг, мне к тому же очень Си нравится. Не люблю модные фичи С++, на раз уж без них нельзя...
А во-вторых, ваш способ вызывает у меня сомнения. Так ли уж он отличается от scanf("%S%S",command,object)? И надёжен ли он - запишется ли то, что нужно, куда нужно, а не в одну переменную, как это иногда бывает? Мне нужна стопроцентная надёжность.
Кипящий чайник вне форума Ответить с цитированием
Старый 21.02.2010, 17:39   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
Ну, на первый вопрос ответить просто - я этакий олдфаг, мне к тому же очень Си нравится. Не люблю модные фичи С++, на раз уж без них нельзя...
А во-вторых, ваш способ вызывает у меня сомнения. Так ли уж он отличается от scanf("%S%S",command,object)? И надёжен ли он - запишется ли то, что нужно, куда нужно, а не в одну переменную, как это иногда бывает? Мне нужна стопроцентная надёжность.
Отличий действительно практически нет, но и scanf у меня работает как надо. В любом случае использование типа string значительно безопаснее и удобнее. В каких случаях scanf работал не так, как ожидалось? Ну а насчёт "модных фич", без них, конечно, можно, но раз уж используете часть, то почему бы не использовать все? Тем более, что это упростит программирование и уменьшит кол-ство неочевидных ошибок
netrino вне форума Ответить с цитированием
Старый 21.02.2010, 18:02   #9
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

В моём случае это был не scanf, а wscanf, и там вводилась команда о двух частях:
Код:
wscanf("%S%S",part1,part2);
Analysis(part1,part2);
Функция analysis сравнивала сначала первую часть (part1) с командами "возьми", "посмотри" и затем, в зависимости от того, с какой командой она совпала, вызывалась функция: LookAt(part2), Take(part2). Там уже part2 сравнивалась с объектами "гитара" и "весло", но порой, даже очень часто бывало, что ни с каким объектом не совпадало. И у меня очень сильное подозрение, что просто в part2 не сохранялась нужная информация.
Кипящий чайник вне форума Ответить с цитированием
Старый 21.02.2010, 18:15   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Цитата:
Сообщение от Кипящий чайник Посмотреть сообщение
В моём случае это был не scanf, а wscanf, и там вводилась команда о двух частях:
Код:
wscanf("%S%S",part1,part2);
Analysis(part1,part2);
Функция analysis сравнивала сначала первую часть (part1) с командами "возьми", "посмотри" и затем, в зависимости от того, с какой командой она совпала, вызывалась функция: LookAt(part2), Take(part2). Там уже part2 сравнивалась с объектами "гитара" и "весло", но порой, даже очень часто бывало, что ни с каким объектом не совпадало. И у меня очень сильное подозрение, что просто в part2 не сохранялась нужная информация.
А может вы просто ошибались при вводе?
Прежде чем браковать библиотечные ф-ции, проверьте на ошибки свои, вероятность, что проблема именно в них значительно выше.
Есть ли какая-нибудь закономерность при возникновении этой ошибки?
netrino вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузить файл в одну строку на Perl Sergey2 Perl 4 16.07.2009 21:03
Как в C++ организовать ввод данных в одну строчку? amdbodia Общие вопросы C/C++ 10 16.05.2009 18:03
Уникальные значения в одну строку Iskin Microsoft Office Excel 9 08.03.2009 09:39
Ввод текста и ссылки в одну ячейку Апчхи Microsoft Office Excel 5 03.02.2009 10:44
Запись в одну строку Terran Общие вопросы Delphi 2 08.05.2008 23:35