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

scanf,cin разбор ввода данных - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 01:21     scanf,cin разбор ввода данных #1
Доброго времени суток
Подскажите как взять с консоли или скажем с файла(fscanf) 2 числа и текст между (текст и числа разделены знаками препинания) или до них вот пример:
15.Text.23
Text.15.23
Text:15:23
логично что
C++
1
2
3
4
5
6
...
int a=NULL,b=NULL;
char str[20];
memset(str,0,20);
scanf("%d %s %d",&a,str,&b);
...
будет работать не так как нам нужно для строки 15.Text.23 a=15; str=".Text.23"; b=0;
Только без варианта взять как строку и кромсать по знакам на числа и текст.

Буду благодарен за все варианты решения
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 01:21     scanf,cin разбор ввода данных
Посмотрите здесь:

Из scanf в std::cin C++
C++ Операторы cin и scanf
C++ какая разница между cin и scanf?
C++ scanf и printf или cin и cout
C++ Отслеживание ввода данных в потоке cin
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2012, 01:31     scanf,cin разбор ввода данных #2
C++
1
int a=NULL,b=NULL; // Зверство, NULL применяется к указателям и то в основном для наглядности
Используй
C++
1
getline();
Либо применяй для таких целей резулярные выражения ( например boost/regex )

Но я не понимаю что мешает вставить между "элементами" пробел "15 .Text. 23"
C++
1
cin>>a>>str>>b;
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 01:46  [ТС]     scanf,cin разбор ввода данных #3
вот то что я пытался расписать. Дается строка 15.Текст.23 нужно ввести чтобы a=15; str=Текст; b=23; главная проблема это без пробелов, вот гетлайн он возьмет строку с кол символов, а потом стадия разбития её на числи или текст: перебором, strtok() или еще как то. Вот когда 3 числа ("%d %d %d",&a,&b,&c) или когда числа в начале ("%d %d %s",&a,&b,str) все отлично, но когда как показано ранние идут траблы
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2012, 01:57     scanf,cin разбор ввода данных #4
C++
1
2
3
4
std::string s1,s2,s3;
getline(cin,s1,'.');// читает строку до разделителя точки
getline(cin,s2,'.');
getline(cin,s3,'.');
Остается преобразовать нужные строки в числа, толко точки не будут учитываться.
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:11  [ТС]     scanf,cin разбор ввода данных #5
а вот теперь поподробней откуда у нас гетлайн и принцип его объявления (если лень объяснять киньте код из main() целиком, тогда вопросов будет меньше) гетлайн из cin? если нет какую библиотеку подключить?
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2012, 02:13     scanf,cin разбор ввода данных #6
http://www.cplusplus.com/reference/string/getline/
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:26  [ТС]     scanf,cin разбор ввода данных #7
все, с просто гетлайн я понял, что в общем можно переписать ваш код вот так:
C++
1
2
3
4
5
6
   char str[20],str_a[20],str_b[20];
   memset(str,0,20);
   cin.getline(str_a,20,'.');
   cin.getline(str,20,'.');
   cin.getline(str_b,20);
   cout<<str<<'\n'<<str_a<<'\n'<<str_b<<endl;
а теперь объясните в чем тогда скажем отличие будет от strtok() кроме того что оно сразу разбивает на слова начиная от точки, а если вместо точки поставить запятую или еще какой знак?

Добавлено через 2 минуты
Давайте, без знаков оставим пока что точку, какие еще есть варианты взять от туда данные?

Добавлено через 2 минуты
Цитата Сообщение от Avazart Посмотреть сообщение
int a=NULL,b=NULL; // Зверство, NULL применяется к указателям и то в основном для наглядности
какая разница? NULL это же макрос, использование его при объявлении или в моменты когда мы зануляем переменные гораздо наглядней будет.
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2012, 02:38     scanf,cin разбор ввода данных #8
можно переписать ваш код вот так:
Ну если вы любитель char-ов...
какие еще есть варианты взять от туда данные?
Парсить регулярным выражением
скажем отличие будет от strtok()
Не знаю не юзал её
какая разница?
Нагляднее для переменных применять 0, а для указателей NULL дабы наглядно отличались.
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:57  [ТС]     scanf,cin разбор ввода данных #9
Цитата Сообщение от Avazart Посмотреть сообщение
Парсить
вот как раз парсинга я и пробую избежать

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
strtok()
там все довольно просто вот его принцип работы и пример использования
ValeryS
Модератор
6377 / 4843 / 442
Регистрация: 14.02.2011
Сообщений: 16,061
15.05.2012, 03:00     scanf,cin разбор ввода данных #10
Цитата Сообщение от Jazz411 Посмотреть сообщение
какая разница? NULL это же макрос, использование его при объявлении или в моменты когда мы зануляем переменные гораздо наглядней будет.
большая
NULL для указателей
для чисел 0
пожалей тех кто твой код читать будет
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:02  [ТС]     scanf,cin разбор ввода данных #11
Цитата Сообщение от ValeryS Посмотреть сообщение
большая
NULL для указателей
для чисел 0
пожалей тех кто твой код читать будет
Это что-то из раздела про удобочитаемость?
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2012, 03:24     scanf,cin разбор ввода данных #12
вместо точки поставить запятую или еще какой знак?
getline() начинает читать символы от текущщего положения потока и до символа-разделителя не важно какой он
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:29  [ТС]     scanf,cin разбор ввода данных #13
Цитата Сообщение от Avazart Посмотреть сообщение
getline() начинает читать символы от текущщего положения потока и до символа-разделителя не важно какой он
это ясно, я о том что если в предложении случайно заменить на запятую то он прочтет все предложение или до точки, что как раз нежелательно

Добавлено через 1 минуту
вот и интересуюсь если аналог такому действию, через гетлайн я уже давно написал
Avazart
 Аватар для Avazart
6906 / 5146 / 253
Регистрация: 10.12.2010
Сообщений: 22,639
Записей в блоге: 17
15.05.2012, 03:29     scanf,cin разбор ввода данных #14
Jazz411, в таком случае только парсить что впинципи не особо сложно, так как регулярка тут будет не сложная
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 03:45     scanf,cin разбор ввода данных
Еще ссылки по теме:

Заменить printf scanf на cout cin C++
C++ Заменить printf на cout, scanf на cin
C++ Scanf vs cin (double variant)

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

Или воспользуйтесь поиском по форуму:
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:45  [ТС]     scanf,cin разбор ввода данных #15
угу, спасибо за внимание
Yandex
Объявления
15.05.2012, 03:45     scanf,cin разбор ввода данных
Ответ Создать тему
Опции темы

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