Хобрук: Ваш путь к мастерству в программировании

C: почему sscanf не вырезает конечные символы?

Следующий код C,

#include <stdio.h>
int main()
{
  char *source="{\"address\":\"10.10.2.130\"}";
  char ip[32];
  sscanf(source, "{\"address\":\"%s\"}", ip);
  printf("%s\n%s\n", source, ip);
  return 0;
}

Я ожидаю извлечь 10.10.2.130 в ip, но вывод показывает 10.10.2.130"}, почему?

Спасибо.

03.09.2015

  • Потому что формат %s означает чтение до тех пор, пока не будет достигнут пробел или конец строки. 04.09.2015
  • Если вы хотите выполнить сопоставление с образцом, используйте библиотеку регулярных выражений. 04.09.2015
  • Я думаю, вы неправильно понимаете, как работает sscanf. Он не пытается сопоставить ввод с указанным вами шаблоном. 04.09.2015

Ответы:


1

Каждая часть строки формата выполняется, не ожидая, что будет дальше. Таким образом, %s соответствует остальной части строки. Последующие символы в строке формата просто не совпадают, потому что вы пытаетесь сопоставить символы, которые уже были прочитаны.

Вам может понадобиться что-то вроде %[^\"]s, которое дополнительно останавливает чтение, если встречается кавычка.

03.09.2015

2

%s прекращает сканирование, когда достигает пробела или конца исходной строки. Поскольку строка, которую вы хотите извлечь, заканчивается символом ", вы можете использовать %[^"], чтобы остановить сканирование на первом встреченном символе ", например:

sscanf(source, "{\"address\":\"%[^\"]\"}", ip);
03.09.2015

3

Спецификация %s:

Совпадение с последовательностью символов, отличных от пробелов.

Так как конечный "} не является пробелом, он включается в соответствие.

Вместо этого вы можете использовать формат %[0-9.] для сопоставления только цифр и точек.

sscanf(source, "{\"address\":\"%[0-9.]\"}", ip);
03.09.2015
Новые материалы

5 проектов на Python, которые нужно создать прямо сейчас!
Добро пожаловать! Python — один из моих любимых языков программирования. Если вы новичок в этом языке, перейдите по ссылке ниже, чтобы узнать о нем больше:

Dall-E 2: недавние исследования показывают недостатки в искусстве, созданном искусственным интеллектом
DALL-E 2 — это всеобщее внимание в индустрии искусственного интеллекта. Люди в списке ожидания пытаются заполучить продукт. Что это означает для развития креативной индустрии? О применении ИИ в..

«Очень простой» эволюционный подход к обучению с подкреплением
В прошлом семестре я посетил лекцию по обучению с подкреплением (RL) в моем университете. Честно говоря, я присоединился к нему официально, но я редко ходил на лекции, потому что в целом я нахожу..

Освоение информационного поиска: создание интеллектуальных поисковых систем (глава 1)
Глава 1. Поиск по ключевым словам: основы информационного поиска Справочная глава: «Оценка моделей поиска информации: подробное руководство по показателям производительности » Глава 1: «Поиск..

Фишинг — Упаковано и зашифровано
Будучи старшим ИТ-специалистом в небольшой фирме, я могу делать много разных вещей. Одна из этих вещей: специалист по кибербезопасности. Мне нравится это делать, потому что в настоящее время я..

ВЫ РЕГРЕСС ЭТО?
Чтобы понять, когда использовать регрессионный анализ, мы должны сначала понять, что именно он делает. Вот простой ответ, который появляется, когда вы используете Google: Регрессионный..

Не зря же это называют интеллектом
Стек — C#, Oracle Опыт — 4 года Работа — Разведывательный корпус Мне пора служить Может быть, я немного приукрашиваю себя, но там, где я живу, есть обязательная военная служба на 3..