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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.90
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
#1

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

15.05.2012, 01:21. Просмотров 1330. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
15.05.2012, 01:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос scanf,cin разбор ввода данных (C++):

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

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

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

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

Переделаем вместе scanf() в cin>> - C++
Был исходник: void Comp::Get() // Ввод данных с клавиатуры =) { printf ("\n Введите действительную часть числа "); scanf...

Scanf vs cin (double variant) - C++
double k = 0.0; scanf("%f", &k); double k1 = 0.0 cin >> k1; Вводим -1,5. Получаем: k = 1.589424581709e-314#DEN double k1...

14
Avazart
Нарушитель
Эксперт С++
7233 / 5405 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
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
Jazz411
85 / 33 / 3
Регистрация: 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
Avazart
Нарушитель
Эксперт С++
7233 / 5405 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
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
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:11  [ТС] #5
а вот теперь поподробней откуда у нас гетлайн и принцип его объявления (если лень объяснять киньте код из main() целиком, тогда вопросов будет меньше) гетлайн из cin? если нет какую библиотеку подключить?
0
Avazart
Нарушитель
Эксперт С++
7233 / 5405 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
15.05.2012, 02:13 #6
http://www.cplusplus.com/reference/string/getline/
0
Jazz411
85 / 33 / 3
Регистрация: 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
Avazart
Нарушитель
Эксперт С++
7233 / 5405 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
15.05.2012, 02:38 #8
можно переписать ваш код вот так:
Ну если вы любитель char-ов...
какие еще есть варианты взять от туда данные?
Парсить регулярным выражением
скажем отличие будет от strtok()
Не знаю не юзал её
какая разница?
Нагляднее для переменных применять 0, а для указателей NULL дабы наглядно отличались.
0
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 02:57  [ТС] #9
Цитата Сообщение от Avazart Посмотреть сообщение
Парсить
вот как раз парсинга я и пробую избежать

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
strtok()
там все довольно просто вот его принцип работы и пример использования
0
ValeryS
Модератор
6682 / 5091 / 477
Регистрация: 14.02.2011
Сообщений: 17,092
15.05.2012, 03:00 #10
Цитата Сообщение от Jazz411 Посмотреть сообщение
какая разница? NULL это же макрос, использование его при объявлении или в моменты когда мы зануляем переменные гораздо наглядней будет.
большая
NULL для указателей
для чисел 0
пожалей тех кто твой код читать будет
0
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:02  [ТС] #11
Цитата Сообщение от ValeryS Посмотреть сообщение
большая
NULL для указателей
для чисел 0
пожалей тех кто твой код читать будет
Это что-то из раздела про удобочитаемость?
0
Avazart
Нарушитель
Эксперт С++
7233 / 5405 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
15.05.2012, 03:24 #12
вместо точки поставить запятую или еще какой знак?
getline() начинает читать символы от текущщего положения потока и до символа-разделителя не важно какой он
0
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:29  [ТС] #13
Цитата Сообщение от Avazart Посмотреть сообщение
getline() начинает читать символы от текущщего положения потока и до символа-разделителя не важно какой он
это ясно, я о том что если в предложении случайно заменить на запятую то он прочтет все предложение или до точки, что как раз нежелательно

Добавлено через 1 минуту
вот и интересуюсь если аналог такому действию, через гетлайн я уже давно написал
0
Avazart
Нарушитель
Эксперт С++
7233 / 5405 / 294
Регистрация: 10.12.2010
Сообщений: 23,956
Записей в блоге: 17
15.05.2012, 03:29 #14
Jazz411, в таком случае только парсить что впинципи не особо сложно, так как регулярка тут будет не сложная
1
Jazz411
85 / 33 / 3
Регистрация: 12.03.2011
Сообщений: 234
Записей в блоге: 2
15.05.2012, 03:45  [ТС] #15
угу, спасибо за внимание
0
15.05.2012, 03:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
15.05.2012, 03:45
Привет! Вот еще темы с ответами:

Заменить cout на printf а cin на scanf - C++
#include &lt;iostream&gt; #include &lt;cmath&gt; using namespace std; int main() { int N, M, p; cout &lt;&lt; &quot;Введите размерность...

Отличие printf/scanf от cout/cin - C++
Я слышал, что принтф и сканф - это форматированный вывод данных , а син и саут - это потоковый вывод данных. Но что это значит? И они...

Заменить cin / cout на scanf / printf - C++
#include&lt;iostream&gt; #include&lt;locale.h&gt; #include&lt;Windows.h&gt; #include&lt;string&gt; #include &quot;123.h&quot; using namespace std; float...

Переделать scanf и printf в cin и cout - C++
#include &quot;stdio.h&quot; #include &quot;math.h&quot; int main() { float S=0; int n=3; printf(&quot;For\n&quot;); for (n=3; n &lt;= 9;...


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

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

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