[c] parsen van een string

Pagina: 1
Acties:

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023
Ik probeer een string op te delen in verschillende stukken, maar het wil nog niet helemaal lukken . . .

de vgl. string wordt meegegeven aan een programma
code:
1
Mar 19 19:14:30 hostname.com 34188: 22w4d: %ISDN-6-CONNECT: Interface BRI1/3:2 is now connected to 0123456789 0123456789

Nu wil ik de vgl. variabelen vullen met delen uit de string. Hier gebruik ik het vgl. voor (m.i. niet relevante delen weggelaten)
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
      char *loghost, *logprog, *logmesg,
      *logup, *logevent, *logdialer, *loginterface; 

      while(fgets(buf, sizeof(buf), stdin))
      {
            if (strlen(buf) > 18)
            {
                loghost = strtok(buf + 16, " ");
                logprog = strtok(NULL, ":");

                logup    = strtok(NULL, ": ");
                logevent = strtok(NULL, ": ");
                logmesg  = strtok(NULL, "\0");

                logdialer = strtok(strstr(logmesg, "to ") + 3, " ");
                loginterface = strtok(strstr(logmesg, "face ") + 5, " ");

                if (loghost && logprog && logmesg)
                {
                  printf("%s\n", logprog);
                  printf("%s\n", logup);
                  printf("%s\n", logevent);
                  printf("%s\n", logdialer);
                  printf("%s\n", loginterface);
                  printf("%s\n", logmesg);
                }

Is dit de juiste manier om zo'n string te parsen? Ik wil aan het einde in logmesg eigenlijk nog de hele string hebben, maar vgl. mij hakt strtok() er steeds stukjes vanaf . . .

  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Als je echt iets wilt leren over parsen dan moet je eens op zoek gaan naar een tutorial (E)BNF. Dit is een taal om andere talen in te schrijven en zo leer je eenvoudig een lexer te schrijven. (Je kan zelf de lexer en parser genereren op basis van de EBNF :) )

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023
goed, da's het eerste wat ik ga doen als ik c helemaal onder de knie heb :P, nu wil ik eigenlijk alleen mijn stringetje ff. goed geparsed hebben, en ik loop er tegenaan dat ik na al mijn strtok()'s geen string meer heb om te parsen . . . (denk ik)

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Is dit de juiste manier om zo'n string te parsen? Ik wil aan het einde in logmesg eigenlijk nog de hele string hebben, maar vgl. mij hakt strtok() er steeds stukjes vanaf . . .
http://www.cplusplus.com/ref/cstring/strtok.html:
If it is found, the function overwrites the delimiter in string by a null-character and returns a pointer to the token, i.e. the part of the scanned string previous to the delimiter.
vandaar dus. Om het op te lossen kun je eerst ff een kopietje van de string maken.

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 20 maart 2002 20:22 schreef Alarmnummer het volgende:
Als je echt iets wilt leren over parsen dan moet je eens op zoek gaan naar een tutorial (E)BNF. Dit is een taal om andere talen in te schrijven en zo leer je eenvoudig een lexer te schrijven. (Je kan zelf de lexer en parser genereren op basis van de EBNF :) )
Das idd erg interessant, maar lijkt me een beetje overdreven hiervoor :)

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023
vandaar dus. Om het op te lossen kun je eerst ff een kopietje van de string maken.
dat heb ik geprobeerd met:
code:
1
2
char *loghelp;
strcopy(loghelp, logmesg);

maar daarna is logmesg nog steeds leeg . . .

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 20 maart 2002 20:28 schreef wizl het volgende:
dat heb ik geprobeerd met:
(...)maar daarna is logmesg nog steeds leeg . . .
oei, das niet echt goed :) je hebt geen geheugen gealloceerd voor loghelp. Als je strdup gebruikt kan het wel zo.

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023
je hebt geen geheugen gealloceerd voor loghelp. Als je strdup gebruikt kan het wel zo.
Waar alloceer ik dan mijn geheugen voor *logmesg enzow? Voor logmesg heb ik ook alleen een de regels
code:
1
2
char *logmesg;
logmesg = NULL;

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 20 maart 2002 20:34 schreef wizl het volgende:
Waar alloceer ik dan mijn geheugen voor *logmesg enzow? Voor logmesg heb ik ook alleen een de regels
code:
1
2
char *logmesg;
logmesg = NULL;
Dat zal wel gealloceerd zijn door de functie die je aanroept om aan die string te komen.

Het kopieren kun je bv. zo doen:
code:
1
2
char kopie[256]; // 256 chars moet genoeg zijn
strcopy(kopie, logmsg);

of
code:
1
2
3
char * kopie = strdup(logmsg);
...
free(kopie); // geheugen weer vrijgeven

  • wizl
  • Registratie: Maart 2001
  • Laatst online: 27-02-2023
het werkt, thanx :)

nu heb ik nog ff. een vraag . . .
ik wil het vgl.
code:
1
2
3
if (logevent == "%ISDN-6-CONNECT") {
  foo;
}

maar dat werkt ook niet (zal ook wel met die pointers te maken hebben, maar echt snappen doe ik het niet)

Verwijderd

waarom gebruik je niet gewoon sscanf() :?

  • marcusk
  • Registratie: Februari 2001
  • Laatst online: 26-09-2023
Op woensdag 20 maart 2002 20:41 schreef wizl het volgende:
nu heb ik nog ff. een vraag . . .
ik wil het vgl.
(...)
maar dat werkt ook niet (zal ook wel met die pointers te maken hebben, maar echt snappen doe ik het niet)
Heeft idd met pointers te maken :) (Je vergelijkt zo de adressen waar de pointers naar wijzen ipv de inhoud v/d strings)

Om strings te vergelijken moet je strcmp gebruiken:
code:
1
if (strcmp(logevent, "%ISDN-6-CONNECT") == 0) { ... }

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

Op woensdag 20 maart 2002 21:18 schreef beelzebubu het volgende:
waarom gebruik je niet gewoon sscanf() :?
geen typechecking, fout, bla bla bla en nog meer standaard geblaat

* .oisyn stemt voor :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Alarmnummer
  • Registratie: Juli 2001
  • Laatst online: 09-07-2024

Alarmnummer

-= Tja =-

Op woensdag 20 maart 2002 20:25 schreef wizl het volgende:
goed, da's het eerste wat ik ga doen als ik c helemaal onder de knie heb :P, nu wil ik eigenlijk alleen mijn stringetje ff. goed geparsed hebben, en ik loop er tegenaan dat ik na al mijn strtok()'s geen string meer heb om te parsen . . . (denk ik)
Je kan het ook uitstekend combineren met c hoor :) Als eerst je taal op gaat stellen in ebnf dan kan je dus met een parser generator, bv Yac of PCCTS (is de c++ versie van ANTLR (java versie)) gewoon c(++) source code genereren. (wat een k*t zin ;) )

ps:
Ik heb verder zelf geen ervaring met c parser generators :) maar Yacc is een klasieker vanaf het unix platform :) en de java versie van PCCTS (ANTLR) gebruik ik zelf naast SableCC.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 11-09 08:26

.oisyn

Moderator Devschuur®

Demotivational Speaker

toch vind ik het idioot om voor zoiets 'simpels' een hele uitgebreide parser te maken/gebruiken... lijkt me een beetje overkill :)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 11-09 10:38

Killemov

Ik zoek nog een mooi icooi =)

Als het iets meer is dan een paar karakters uit een string plukken oid ... dan loont het al vrij snel om Lex (A lexical analyzer) te gaan gebruiken. Ja, ik heb OOK Lex en Yacc moeten leren. :Z

Hey ... maar dan heb je ook wat!


Verwijderd

Op woensdag 20 maart 2002 22:53 schreef OiSyN het volgende:
geen typechecking, fout, bla bla bla en nog meer standaard geblaat
Een goede programmeur... >:)

TOA blablabla hardcore blablabla 31337 blablabla :Y)
/me stemt voor :)
bedoel ik!
woei! :9~ :D

Ga jij de sscanf() vs. strtok() benchmakr uitvoeren of ik? :D
Pagina: 1