2016-11-22 2 views
-8

У меня есть программа C, которая считывает с клавиатуры, например:C++ эквивалент форматной строки языка C

scanf("%*[ \t\n]\"%[^A-Za-z]%[^\"]\"", ps1, ps2); 

Для лучшего понимания того, что эта команда делает, давайте разбить строку формата следующим образом:

%*[ \t\n]\" => читать все пробелы, табуляции и новые строки ([ \t\n]), но не хранить их в любой переменной (отсюда «*») и будет читать до тех пор, пока не встретит двойную кавычку (\"), однако двойная кавычка не вводится ,

Однажды scanf() нашел двойную кавычку, читает все символы, которые не являются буквами в ps1. Это выполняется с помощью ...

%[^A-Za-z] => введите что-либо не заглавную букву 'A' через 'Z' и строчную букву 'a' через 'z'.

%[^\"]\" => прочитать все оставшиеся символы до, но не включая двойные кавычки в ps2 ([^\"]) и строка должна заканчиваться кавычками (\"), однако двойные кавычки не вводится.

Может кто-то показать мне, как сделать то же самое в C++

Спасибо

+0

Кажется, что я сказал, что это не ясно для некоторых людей! 'cin существует в C++, чтобы заменить scanf на C, иначе нам не нужны' cin ',' cout 'и все возможности C++. – user7140484

+0

@AndrewHenle, так что вы имеете в виду, что я не могу читать с консоли, предоставляя некоторые ограничения! Это ты сказал? Извините, но я не возражаю. – user7140484

+0

@ 0x5453 Я не хочу ссылаться на scanf на C++. Я хочу сделать то же самое без cstdio. – user7140484

ответ

3

C++ поддерживает функцию scanf. Нет простой альтернативы, особенно если вы хотите воспроизвести точную семантику scanf() со всеми причудами.

Однако обратите внимание, что код имеет несколько вопросов:

  • Вы не передать максимальное количество символов для чтения в ps1 и ps2. Любая достаточная последовательность ввода вызовет переполнение буфера с тяжелыми последствиями.

  • Вы можете упростить первый формат %*[ \t\n] с помощью пробела в строке формата. Это также учитывает случай отсутствия пробельных символов. Как в настоящее время написано, scanf() потерпит неудачу и вернет 0, если символы whitspace не присутствуют до ".

  • Точно так же, если не не являющиеся буквами или, если никакие другие символы не следуют до второго ", scanf возвратит короткий отсчет из 0 или 1 и оставить один или оба массива назначения в неопределенном состоянии.

По всем этим причинам, было бы гораздо более безопасным и предсказуемым в C для первого чтения строки ввода с fgets() и использовать sscanf() или разобрать строку вручную.

В C++ вы определенно хотите использовать пакет std::regex, определенный в <regex.h>.

Смежные вопросы