C - scanf для вывода числа в кавычках только после определенной последовательности символов - PullRequest
0 голосов
/ 09 ноября 2019

Скажем, у меня есть строка, подобная этой:

Hello World - this is a line of textCOLOR="4"

, и эта строка хранится в buf[1000]

Как вы можете видеть, эта строка имеет цветной тег в формате COLOR="n". Число - это то, что нужно вытащить (это может быть от 1 до 56) и присвоить переменной int. Я бы хотел, чтобы этот тег был в любом месте строки.

Я могу запустить следующий код для извлечения значения цвета:

int colorNumber = 1; //default value
if (scanf(buf, "%*[^\"]\"%2d[^\"]\"", &colorNumber)) {
    // work with number
}

, и это прекрасно работает, но если строка будет содержать число или кавычку, то scanf завершится ошибкойчтобы получить число.

Я попробовал несколько вариантов моего второго аргумента scanf, но они не сработали. Я попробовал "%*[^\"]COLOR=\"%2d[^\"]\"", но, похоже, это не сработало.

Я просмотрел справочные страницы для scanf, но там я тоже не смог найти то, что искал.

Возможно, scanf не подходит для этого? Я готов попробовать другие библиотеки / функции при необходимости.

1 Ответ

0 голосов
/ 10 ноября 2019

try

if (sscanf(buf, "%*[^C]COLOR=\"%d", &colorNUM) == 1)

Причина, по которой ваш попытанный формат "%*[^\"]COLOR" ... не сработал, состоит в том, что %*[\"] соответствует всему, вплоть до ", пропуская ЦВЕТ, поэтомутогда не в состоянии соответствовать ЦВЕТУ. Однако вышеприведенное не будет выполнено, если в строке есть еще C в каком-то другом месте до COLOR. Чтобы избежать этого, вам, вероятно, лучше использовать strstr, возможно, в цикле, если COLOR может появиться в нескольких местах.

for (const char *p = buf; p = strstr(p, "COLOR"); ++p) {
    if (sscanf(p, "COLOR=\"%d", &colorNum) == 1) {
        // found a color number

Обратите внимание, что попытки сопоставлять символы после %d бессмысленныв зависимости от того, совпадают они или нет, возвращаемые значения будут одинаковыми, поэтому невозможно определить. Если вы хотите убедиться, что после числа стоит ", вам нужно что-то вроде

int end = 0;
if (sscanf(p, "COLOR=\"%d\"%n", &colorNum, &end), end > 0)

, проверив, что %n записал что-то в end, вы также проверите, что все до %n соответствует правильно.

...