Использование sscanf для разбора двух строк - PullRequest
1 голос
/ 20 мая 2010

У меня есть файл в формате XML, который содержит строку в следующем формате:

<param name="Distance" value="1000Km" />

Первый символ в строке обычно представляет собой символ табуляции или пробелы. Я использовал следующее, чтобы попытаться разобрать две строки (из имени и значения):

if(sscanf(lineread, "\t<param name=\"%s\" value=\"%s\" />", name, value) == 1)
{
    //do something
}

имя и значение являются символами *

Теперь результат всегда один и тот же: name получает анализ (мне нужно удалить кавычки), а name всегда пусто. Что я делаю не так?

Спасибо, код приветствуется.

Jess.

Ответы [ 2 ]

5 голосов
/ 20 мая 2010

Как обычно, скансет, вероятно, ваш лучший ответ:

sscanf(lineread, "%*[^\"]\"%[^\"]\"%*[^\"]\"%[^\"]\"", name, value);

Конечно, для реального кода вы также хотите ограничить длину конверсий:

#include <stdio.h>

int main() { 
    char lineread[] = "<param name=\"Distance\" value=\"1000Km\" />";   
    char name[256], value[256];

    sscanf(lineread, "%*[^\"]\"%255[^\"]\"%*[^\"]\"%255[^\"]\"", name, value);

    printf("%s\t%s", name, value);
    return 0;
}

Edti: Кстати, sscanf возвращает количество успешных преобразований, поэтому в исходном коде вы, вероятно, хотели бы сравнить с 2 вместо 1.

Edit2: это много: %*[^\"]\" означает «читать и игнорировать символы, отличные от кавычек», затем читать и пропускать кавычки. Следующий %255[^\"]\" означает «прочитать до 255 символов, отличных от знака кавычки, затем прочитать и пропустить знак кавычки. Затем весь шаблон повторяется для чтения второй строки.

1 голос
/ 20 мая 2010

Проблема с исходным кодом заключалась в том, что %s останавливается только после просмотра пробела. Следовательно, name получает Distance" не Distance, как ожидалось.

...