Как мне использовать sscanf () для разбора этой строки текста? - PullRequest
0 голосов
/ 01 марта 2019

У меня есть строка текста, которую я хочу проанализировать, например: «A, B (C10D)», и после анализа она должна распечатать что-то вроде:

value 1: A
value 2: B
value 3: C10D

Как видите,У меня есть два разделителя: запятая и открывающая и закрывающая скобки ().

Это код, который я написал до сих пор, с помощью других ответов о потоках переполнения стека, но, похоже, он неработа ...

char text[100] = "A,B(C10D)";
sscanf(text,"%s,%s(%s)",val1,val2,val3);

printf("Value 1: %s\n", val1);
printf("Value 2: %s\n", val2);
printf("Value 3: %s\n", val3);

Что-то не так с моим форматом?

1 Ответ

0 голосов
/ 01 марта 2019

%s сканирует, пока символ пробела (или EOF) не будет.

Используйте спецификатор формата %[ для анализа вашей строки:

sscanf(text, "%[^,],%[^(](%[^)])", val1, val2, val3);

%[^,] будет сканировать все до тех пор, пока a ,
, не будет использовать запятую, поскольку %[^,] не будет ее использовать
%[^(] будет сканировать все до a (
( будет использовать левую скобку, поскольку %[^(] не будет использовать ее
и т. Д.


Всегда проверяйте возвращаемое значение sscanf.sscanf возвращает количество аргументов, успешно прочитанных и присвоенных.

int retVal = sscanf(text,"%[^,],%[^(](%[^)])", val1, val2, val3);
if(retVal == 3)
{
    /* Scanned and assigned all three arguments successfully */
}
else if(retVal == EOF)
{
    /* EOF was encountered */
}
else
{
    /* Invalid input; parsing error */
}
...