Облазил поисковик, но ответа на свой вопрос так и не нашел.
Есть две строки, которые вводятся в консоли с клавиатуры:
1) " folder2 10"
Эту строку я хочу записать в масис char, как " folder2" (включая пробелы)
а цифру "10" в переменную типа int/
2) "4 1 2 3"
Эту строку я хочу записать, как int в Массив int.
Как это можно сделать?
Пробовал различные комбинации форматированного ввода scanf, но не помогло, также пробовал делать scanf в цикле.
Получать строку целиком, а потом переводить цифры с помощью atoi — не вариант.
Получить ввод с клавиатуры хочется стандартными методами, без использования специфических библиотек.
Кто-нибудь может помочь?)
Здравствуйте, vandi711, Вы писали:
V>Есть две строки, которые вводятся в консоли с клавиатуры:
V>1) " folder2 10" V> Эту строку я хочу записать в масис char, как " folder2" (включая пробелы) V> а цифру "10" в переменную типа int/ V>2) "4 1 2 3" V> Эту строку я хочу записать, как int в Массив int.
Boost.Spirit2. Решение будет записываться в одну, максимум две строчки.
Здравствуйте, jazzer, Вы писали:
J>Boost.Spirit2. Решение будет записываться в одну, максимум две строчки.
Прошу прощения, нужно было более конкретизировать. Требуется использовать только стандартную библиотеку, Boost, к сожалению не подходит...
Но, спасибо, буду знать)
По поводу второго типа строк, забыл сказать, что заранее количество цифр в строке неизвестно.
Re: форматированный ввода. scanf или что-то другое?
Здравствуйте, vandi711, Вы писали:
V>Как это можно сделать?
для простых сценариев предлагаю использовать std::stringstream
пример: http://liveworkspace.org/code/3ZgZML$0
при этом ваш первый пример распарсится не так, как вы хотите, ибо пробелы проглотятся, ибо считается разделителем
Re[3]: форматированный ввода. scanf или что-то другое?
Здравствуйте, vandi711, Вы писали:
V>По поводу второго типа строк, забыл сказать, что заранее количество цифр в строке неизвестно.
если вы еще опишите какими могут быть строки первого типа, то мы можем составить регулярное выражение для парсинга и воспользоваться std::regexp (вы каким компиляторм пользуетесь? не все поддерживают std::regexp )
Re[2]: форматированный ввода. scanf или что-то другое?
Здравствуйте, uzhas, Вы писали:
U>для простых сценариев предлагаю использовать std::stringstream U>пример: http://liveworkspace.org/code/3ZgZML$0 U>при этом ваш первый пример распарсится не так, как вы хотите, ибо пробелы проглотятся, ибо считается разделителем
Ага, хорошо, спасибо, посмотрю, пощупаю))
Re[4]: форматированный ввода. scanf или что-то другое?
V>>По поводу второго типа строк, забыл сказать, что заранее количество цифр в строке неизвестно. U>если вы еще опишите какими могут быть строки первого типа, то мы можем составить регулярное выражение для парсинга и воспользоваться std::regexp (вы каким компиляторм пользуетесь? не все поддерживают std::regexp )
Использую я g++.
Строки первого типа идут примерное по следующей схеме:
(Некоторое количество пробелов от 0 до n) + (строка, содержащая как буквы, так и цифры) + пробел + идентификатор.
Примеры:
1) "root 1"
2) " root/folder 5"
3) " root/folder/example1000 10"
Re[2]: форматированный ввода. scanf или что-то другое?
V>>>По поводу второго типа строк, забыл сказать, что заранее количество цифр в строке неизвестно. U>>если вы еще опишите какими могут быть строки первого типа, то мы можем составить регулярное выражение для парсинга и воспользоваться std::regexp (вы каким компиляторм пользуетесь? не все поддерживают std::regexp )
V>Использую я g++.
V>Строки первого типа идут примерное по следующей схеме: V>(Некоторое количество пробелов от 0 до n) + (строка, содержащая как буквы, так и цифры) + пробел + идентификатор. V>Примеры: V>1) "root 1" V>2) " root/folder 5" V>3) " root/folder/example1000 10"
Казалось бы! "%s %d" именно это и распарсит. Выкинет ведущие пробелы, возьмёт текст без пробелов, выкинет промежуточные пробелы, возьмёт число.
Перекуём баги на фичи!
Re[3]: форматированный ввода. scanf или что-то другое?
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, vandi711, Вы писали:
V>>Долгими мурыжаньями у меня получилась регуляярка вида .*?(?=\s\d) V>>Но вот, если писать:
V>>
V>>scanf("%[.*?(?=\s\d)]%d", str, &digit)
V>>
Что то я заманьячился. Для первого типа строк там достаточно вот такого кода:
Здравствуйте, uzhas, Вы писали:
U>пишут, что regexp на gcc unusable U>http://stackoverflow.com/questions/14776605/c-11-regex-error U>этот код у меня работает на VS U>на gcc не взлетело
да, регулярки пока не реализованы. их оставили для 4.9 версии.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re[4]: форматированный ввода. scanf или что-то другое?