2013-03-06 17 views
6

Używam C++, ale Postanowiłem przeanalizować wiersze pliku dziennika z sscanf. Po przeczytaniu każdej linii należy wyodrębnić dane i zapisać je w zmiennych.Przeczytaj pełną nazwę sscanf

string test = "[06/03/2013 18:15:23] INFO - Open [Johny Cage]"; 

int day, month, year, second, minute, hour; 
char name[128]; 

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^\n]%c]", 
       &day, &month, &year, &second, &minute, &hour, name); 

if (c == 7) 
{ 
    cout << name << endl; 
} 

muszę odczytać nazwy jako Johny Cage (Nazwa może zawiera spacje) i przechowywać je name, ale wyjście jest:

Johny Cage]

Problemem jest to, bieżący ]. Jak mogę użyć sscanf, którego nie czyta ostatni ]?

+1

Użyj '[^]]' zamiast '[^ \ n]'. – jxh

+0

@ user315052: Nie, program się zawiesił! – deepmax

+0

'name [strlen (name) - 1] = 0;' –

Odpowiedz

7

Użyj [^]] zamiast [^\n]. Usuń także %c na końcu łańcucha formatu skanowania.

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^]]]", 
       &day, &month, &year, &second, &minute, &year, name); 
3

Sprawdzając przeciwko niemu. Spróbuj tego:

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^\]\n]]%*[^\n]\n", 
      &day, &month, &year, &second, &minute, &year, name); 

] musi być uciekł, inaczej byłoby to należy rozumieć jako „koniec ogranicznika łańcucha”, który będzie wówczas pusta ... a co nielegalne.

Z tym dodatkiem zatrzyma się przy przełamaniu linii lub a], niezależnie od tego, co nastąpi wcześniej.

I oczywiście usuń ten% c ... w końcu nie zapisujesz go do żadnej zmiennej.

Ostatni dodatek przeczyta następny znak nowej linii, który znajdzie i odrzuci wszystkie znalezione znaki po drodze (czyli *).

+0

Jeśli ']' jest pierwszym znakiem po nawiasie otwartym (lub w tym przypadku oknem), to jest on zawarty w zestawie i nie trzeba go zamykać. – mrh

+0

Z pewnością jednak nie ucierpi. –

1

Nie jestem pewien, co się dzieje z okazji dopasować nazwę, ale to działa na mnie:

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%[^]]"

Dopasowuje nic oprócz wspornika końcowego.

+2

Ponieważ w buforze 'name' może znajdować się tylko 128 znaków, należy użyć'% 127 [^]] ', w przeciwnym razie ryzykujesz przepełnienie bufora. –

+0

To by działało, ale pozostawiłoby końcowe ']' w pliku wejściowym. Musi to być '[% 127 [^]]]', aby się go pozbyć. – teppic

Powiązane problemy