[C] sscanf doet niet wat ik wil

Pagina: 1
Acties:

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Topicstarter
Ik ben bezig wat input te parsen (config files), en gebruik daarvoor nu sscanf.
Er zijn 2 soorten regels:
- [section]
- option = value

Ik haal de regels op met fgets, dat gaat goed. De tweede soort regel parsen gaan ook goed:
C:
1
if (sscanf(line, "%s = %s\n", option, value) == EOF) { /* error */ }
option en value worden precies wat ze moeten worden. Alleen de eerste soort regel doet het niet goed:
C:
1
2
3
len = strlen(line);
if (len < 4 || line[len-2] != ']') { /* error */ }
if (sscanf(line, "[%s]\n", section) == EOF) { /* error */ }
Het probleem is hierbij, dat als line bv [Thumbs] is, dan wordt section niet Thumbs maar Thumbs], dus inclusief laatste ] !

Als ik nml bv daarna de volgende code uitvoer, dan komt daar uit "Section: Thumbs], line: [Thumbs]"
C:
1
printf("Section: %s, line: %s", section, line);


Alle "strings" zijn gedeclareerd als char arrays van size 1024; fgets gebruikt deze 1024 ook om het op te halen.

Wat doe ik fout??

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

sscanf werkt de format string (in jouw geval "[%s]") van links naar rechts af.
In jouw geval matcht sscanf de eerste '[' met die in je input, en daarna matcht de rest van je input (dus tot en met de ']') met de %s vlag. Daarna is de input string op, en kapt sscanf ermee..

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Topicstarter
Ah tuurlijk, stom |:(

Ik heb het opgelost mbv
C:
1
sscanf(line, "[%[^]]s]\n", section)
(lees totdat je een ] tegenkomt).
Daarna even controleren of de lengte wel goed is (de lengte van de regel - 3 ([, ] en \n), en klaar is IceManX!

Bedankt!

[ Voor 4% gewijzigd door Robtimus op 24-03-2004 14:26 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


  • Limhes
  • Registratie: Oktober 2001
  • Laatst online: 09-04 16:10
Zo te zien wil je ini files inlezen. Aangenomen dat je onder windows werkt, is de GetPrivateProfileString API functie niet the right tool for this job?

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Topicstarter
Limhes schreef op 24 maart 2004 @ 15:02:
Zo te zien wil je ini files inlezen. Aangenomen dat je onder windows werkt, is de GetPrivateProfileString API functie niet the right tool for this job?
Foute aanname dus :P

Ik heb een tool in Python gemaakt die gebruik maakt van de ConfigParser class. Die werkt idd met de ini opbouw.
Nu wil ik die tool (oa vanwege de ervaring) gaan herschrijven in C met GTK, voor Linux / UNIX.

Maar ondertussen is de port al klaar, op misschien geheugengebruik na. Volgens mij vergeet ik ergens iets te free-en, want volgens memusage allocate ik in totaal 3443 en free ik maar 1162; wel tegen 50 allocs en 75 free's...; kan ook komen door het testprogramma, maar na het toevoegen van slechts 1 sectie heb ik al 2 minder free's dan mallocs. Ach ja...

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

Valgrind is de perfecte memory debugging tool voor Linux/x86. :).

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 09:46

Robtimus

me Robtimus no like you

Topicstarter
Verwijderd schreef op 24 maart 2004 @ 19:46:
Valgrind is de perfecte memory debugging tool voor Linux/x86. :).
Idd een uitstekende tool!
Een ander programma liet wel uitstekende resultaten zien in memusage, maar ik had ergens een verkeerde malloc gedaan. Valgrind kwam er mooi achter!

More than meets the eye
There is no I in TEAM... but there is ME
system specs

Pagina: 1