Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/9: Рейтинг темы: голосов - 9, средняя оценка - 4.67
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
1

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

15.05.2012, 01:21. Показов 1841. Ответов 14
Метки нет (Все метки)

Доброго времени суток
Подскажите как взять с консоли или скажем с файла(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;
Только без варианта взять как строку и кромсать по знакам на числа и текст.

Буду благодарен за все варианты решения
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
15.05.2012, 01:21
Ответы с готовыми решениями:

Cin: проверка ввода данных
Выполняю одну задачку, с проверкой на ввод данных типа int/double, ошибка, если - введены данные...

Отслеживание ввода данных в потоке cin
Добрый вечер. Предположим такой код: void fiterations(int &iter_i) { if (!cin) { cout...

Операторы cin и scanf
Пример кода: void func(float* p){ cout << "Введите значение"; scanf("%f\n", &p); } Как...

Cin точнее scanf?
Здравствуйте. Во время написания кода и попытки понимания возникновения ошибки, отправил на проход...

14
Эксперт С++
8359 / 6097 / 610
Регистрация: 10.12.2010
Сообщений: 28,427
Записей в блоге: 30
15.05.2012, 01:31 2
C++
1
int a=NULL,b=NULL; // Зверство, NULL применяется к указателям и то в основном для наглядности
Используй
C++
1
getline();
Либо применяй для таких целей резулярные выражения ( например boost/regex )

Но я не понимаю что мешает вставить между "элементами" пробел "15 .Text. 23"
C++
1
cin>>a>>str>>b;
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 01:46  [ТС] 3
вот то что я пытался расписать. Дается строка 15.Текст.23 нужно ввести чтобы a=15; str=Текст; b=23; главная проблема это без пробелов, вот гетлайн он возьмет строку с кол символов, а потом стадия разбития её на числи или текст: перебором, strtok() или еще как то. Вот когда 3 числа ("%d %d %d",&a,&b,&c) или когда числа в начале ("%d %d %s",&a,&b,str) все отлично, но когда как показано ранние идут траблы
0
Эксперт С++
8359 / 6097 / 610
Регистрация: 10.12.2010
Сообщений: 28,427
Записей в блоге: 30
15.05.2012, 01:57 4
C++
1
2
3
4
std::string s1,s2,s3;
getline(cin,s1,'.');// читает строку до разделителя точки
getline(cin,s2,'.');
getline(cin,s3,'.');
Остается преобразовать нужные строки в числа, толко точки не будут учитываться.
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:11  [ТС] 5
а вот теперь поподробней откуда у нас гетлайн и принцип его объявления (если лень объяснять киньте код из main() целиком, тогда вопросов будет меньше) гетлайн из cin? если нет какую библиотеку подключить?
0
Эксперт С++
8359 / 6097 / 610
Регистрация: 10.12.2010
Сообщений: 28,427
Записей в блоге: 30
15.05.2012, 02:13 6
http://www.cplusplus.com/reference/string/getline/
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:26  [ТС] 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 это же макрос, использование его при объявлении или в моменты когда мы зануляем переменные гораздо наглядней будет.
0
Эксперт С++
8359 / 6097 / 610
Регистрация: 10.12.2010
Сообщений: 28,427
Записей в блоге: 30
15.05.2012, 02:38 8
можно переписать ваш код вот так:
Ну если вы любитель char-ов...
какие еще есть варианты взять от туда данные?
Парсить регулярным выражением
скажем отличие будет от strtok()
Не знаю не юзал её
какая разница?
Нагляднее для переменных применять 0, а для указателей NULL дабы наглядно отличались.
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:57  [ТС] 9
Цитата Сообщение от Avazart Посмотреть сообщение
Парсить
вот как раз парсинга я и пробую избежать

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
strtok()
там все довольно просто вот его принцип работы и пример использования
0
Модератор
Эксперт по электронике
8383 / 6227 / 837
Регистрация: 14.02.2011
Сообщений: 21,621
15.05.2012, 03:00 10
Цитата Сообщение от Jazz411 Посмотреть сообщение
какая разница? NULL это же макрос, использование его при объявлении или в моменты когда мы зануляем переменные гораздо наглядней будет.
большая
NULL для указателей
для чисел 0
пожалей тех кто твой код читать будет
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:02  [ТС] 11
Цитата Сообщение от ValeryS Посмотреть сообщение
большая
NULL для указателей
для чисел 0
пожалей тех кто твой код читать будет
Это что-то из раздела про удобочитаемость?
0
Эксперт С++
8359 / 6097 / 610
Регистрация: 10.12.2010
Сообщений: 28,427
Записей в блоге: 30
15.05.2012, 03:24 12
вместо точки поставить запятую или еще какой знак?
getline() начинает читать символы от текущщего положения потока и до символа-разделителя не важно какой он
0
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:29  [ТС] 13
Цитата Сообщение от Avazart Посмотреть сообщение
getline() начинает читать символы от текущщего положения потока и до символа-разделителя не важно какой он
это ясно, я о том что если в предложении случайно заменить на запятую то он прочтет все предложение или до точки, что как раз нежелательно

Добавлено через 1 минуту
вот и интересуюсь если аналог такому действию, через гетлайн я уже давно написал
0
Эксперт С++
8359 / 6097 / 610
Регистрация: 10.12.2010
Сообщений: 28,427
Записей в блоге: 30
15.05.2012, 03:29 14
Jazz411, в таком случае только парсить что впинципи не особо сложно, так как регулярка тут будет не сложная
1
85 / 33 / 12
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:45  [ТС] 15
угу, спасибо за внимание
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.05.2012, 03:45

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

Из scanf в std::cin
Как тоже самое сделать с помощью std::cin? printf(&quot;Введите автора %d книги.\n&quot;,i+1);...

Scanf vs cin (double variant)
double k = 0.0; scanf(&quot;%f&quot;, &amp;k); double k1 = 0.0 cin &gt;&gt; k1; Вводим -1,5. Получаем: k =...

Переделаем вместе scanf() в cin>>
Был исходник: void Comp::Get() // Ввод данных с клавиатуры =) { printf (&quot;\n Введите...

Заменить printf scanf на cout cin
#include&lt;iostream.h&gt; #include&lt;math.h&gt; #pragma argsused int main(int argc, char* argv) {int i;...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.