Intereting Posts
Инициализация объектов макросами для целочисленных констант Как повторно использовать (цикл) ключ в vigenere cipherkey cs50 pset2 Можно ли использовать C11-ограждения, чтобы рассуждать о записи из других streamов? 23warning: присваивание делает указатель из целого без литой Отслеживать каталог только для новых файлов Как использовать указатели для выделения массива внутри другой функции Использование синтаксиса инициализации структуры для структуры on-heap make: *** Нет правила для создания целевой `gcc ‘, необходимой для` all’. Стоп Добавить строку в строку в C с безопасными функциями 64-разрядный исполняемый файл работает медленнее, чем 32-разрядная версия Соответствует ли ICC спецификациям C99 для умножения комплексных чисел? opendir: Слишком много открытых файлов Управление памятью: строка NSString stringWithCString: кодировка: Подсчет количества уникальных пар и экземпляров неповторимых пар в несортированных данных Можно ли сохранить адрес метки в переменной и использовать goto для перехода к ней?

C ++ эквивалент строки формата C

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

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

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

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

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

%[^A-Za-z] => введите ничего, кроме прописной буквы ‘A’ через ‘Z’ и строчной буквы ‘a’ через ‘z’.

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

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

Спасибо

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

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

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

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

  • Аналогично, если нет букв или если никакие другие символы не следуют перед вторым " , scanf вернет короткий счет 0 или 1 и оставит один или оба целевых массива в неопределенном состоянии.

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

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