Сканируйте строку от пробела до конца, используя спецификатор формата

У меня есть код, который сканирует строку и сохраняет значения в нескольких временных переменных.

Вот пример кода:

char str[] = "# # Time=80 interval";
char hash1, hash2;
char timeStr[20];

sscanf(str, "%c %c %[^\0]s", &hash1, &hash2, timeStr);

printf("hash 1: %c\n", hash1);
printf("hash 2: %c\n", hash2);
printf("Time String: %s\n", timeStr);

Фактический результат:

hash 1: #
hash 2: #
Time String: 

Ожидаемый результат:

hash 1: #
hash 2: #
Time String: Time=80 interval

Я изменил код, и он работает:

sscanf(str, "%c %c **%[^\n]s**", &hash1, &hash2, timeStr);

Это устаревший код %[^\0]s и сейчас он не работает.

Может ли кто-нибудь случайно помочь понять, почему он работал раньше и перестал работать сейчас?

Что вам нужно, так это регулярные выражения, которые являются частью STL, начиная с C++11. И sscanf не работайте с регулярными выражениями. Итак, если вы намеренно не придерживаетесь C++98, он очень прост в использовании и к тому же портативен cplusplus.com/reference/regex

armagedescu 24.07.2024 17:08
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
1
98
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В этот строковый литерал вы вставили \0:

"%c %c %[^\0]s"

Функция scanf увидит все, вплоть до \0, поэтому она видит строку формата.

"%c %c %[^"

Некоторые составители могут даже пожаловаться на это и сказать «no closing ']' for '%[' format».

Более того, %[^\n]s должно быть просто %[^\n]. %[...] и %s — разные спецификаторы преобразования. Кроме того, всегда проверяйте возвращаемое значение scanf.

Может ли кто-нибудь случайно помочь понять, почему он работал раньше и перестал работать сейчас?

Предыдущий компилятор, по-видимому, обрабатывал незавершенную последовательность %[^ как %[^\0], чтобы допустить подобные ошибки, и в этом случае вы, вероятно, могли бы просто использовать "%c %c %[^" со старым компилятором. Новый компилятор не поддерживает это расширение.

Кстати, побег тоже не решает проблему Демо

Jarod42 24.07.2024 13:20

Спасибо @Ted, понял. Я не ожидаю новой строки во входной строке. Я просто хочу прочитать все символы до конца строки. Как вы думаете, [^\n] — правильный выбор. Более ранняя реализация, похоже, [^\0] предназначена для чтения всех символов до тех пор, пока не встретится завершающий символ '\0'

Priyanka Chauhan 24.07.2024 13:21

@PriyankaChauhan Если вы придерживаетесь scanf, просто используйте любой символ, которого гарантированно нет в строке. \n часто хорошо, но есть много других, которые вы могли бы использовать. Лично я бы полностью отказался от scanf и использовал std::string и вспомогательные функции C++, например std::getline.

Ted Lyngmo 24.07.2024 13:28

@Jarod42 Нет, вот бы прочитать всё до первого \ или 0 :-)

Ted Lyngmo 24.07.2024 13:30

Другие вопросы по теме