2013-04-08 7 views
1

У меня есть строка вида [S{i,j} : this is stack overflow] Я хочу, чтобы извлечь i,j и this is stack overflow в двух отдельных строках. sscanf здесь не работает, поскольку строки, которые нужно извлечь, могут иметь пробелы.Эффективный способ извлечения форматированных данных в C

Может ли кто-нибудь предложить эффективный способ сделать это?

ответ

9

Если строка не может содержать окончание квадратных скобок, вы можете абсолютно использовать sscanf():

int i, j; 
char text[128]; 

if(sscanf(input, "[S{%d,%d} : %127[^]]", &i, &j, text) == 3) 
{ 
    printf("got it all!\n"); 
} 

Для получения дополнительной информации о несколько менее известном спецификаторе преобразования [, смотрите, например, this manual page. В основном, преобразование %[^]] означает «все символы, кроме закрывающей квадратной скобки, это специальная форма синтаксиса с использованием как отрицание (^) и удвоения закрывающей скобки, чтобы включить его в наборе отрицаний символов.

UPDATE Если вы на самом деле означает «в двух отдельных строк», то, конечно, выше неверно, так как он разбирает из числа в int -типа переменных Чтобы получить пару в виде строки, использовать что-то вроде:.

char ij[32], text[128]; 

if(sscanf(input, "[S{%31[^}]} : %127[^]]", ij, text) == 2) 
{ 
} 
+0

Почему downvote ? Это работает и является стандартным – cnicutar

+2

Измените '% S' на' S', и он будет работать нормально: http://ideone.com/ ZAe1N4 (я не ответил на ваш ответ). – Crozin

+0

+1 избили меня :) –