Suche passendes Muster zum einlesen von Strings!!!



  • Guten Tag,
    Ich bin grade dabei ein Programm zu schreiben(ANSI-C-Standard Konform), was Befehle aus einer Datei lädt und ausführt.
    Ich kann die Datei öffnen und Zeilenweise auslesen. Jetzt ist es erforderlich eine Zeile in mehrere Strings zu Scannen(realisiert mit sscanf).
    Mein Problem ist das Muster, da ich die passenden Wildcards nirgends finden kann.
    Eine Zeile sieht z.B. so aus: "BEFEHL1(space)../irgendeine/pfad(space)BEFEHL2(space)BEFEHL3 " .
    Nun muss ich ein passenden sscanf-Aufruf finden der dieses Beispiel in 4 Strings speichert.
    Ich dachte mir das ich die Strings in etwa so einlesen muss:

    sscanf(string_file_line"%[^(space),%[^space],...]",string1,string2,...);
    

    aber das klappt nicht.

    Habt ihr lieben C-Programmierer einen passenden Aufruf von sscanf, der auf dieses Pattern passt?

    Mir ist das direkt peinlich für so ein kleines Problem zu fragen. Komme aber einfach nicht weiter.

    MfG Said



  • if( 4==sscanf(string_file_line,"%s%s%s%s",s1,s2,s3,s4) )
      printf("%s%s%s%s",s1,s2,s3,s4);
    

    falls deine Strings (z.B. Pfad) selbst keine Leerzeichen/Whitespaces enthalten.



  • Vielen dank für die schnelle Antwort!
    Das Klappt bestens.
    Ich habe zu kompliziert gedacht 😉

    Schönen Tag noch!

    MfG Said



  • Hallo, ich hab ne ähnlich schwierigkeit wie oben...

    Ich lese ne txt.datei in einen buffer "rbuf" ein, deren in halt so aussieht:

    1 111.22.333.44
    2 222.333.44.55
    3 333.44.555.66

    //zum ermitteln der Daten
    	//===================================
    	short	get_ident1 = 0;
    	short	get_ident2 = 0;
    	short	get_ident3 = 0;
    	char	getc_ident1[1] = {'0'};
    	char	getc_ident2[1] = {'0'};
    	char	getc_ident3[1] = {'0'};
    	char	get_ip1[16] = ("0");
    	char	get_ip2[16] = ("0");
    	char	get_ip3[16] = ("0");
    
    	//Lese Daten ein
    		sscanf(rbuf,"%s%s%s%s%s%s",&getc_ident1, &get_ip1, &getc_ident2, &get_ip2, &getc_ident3, &get_ip3); 
    		printf("\ndebug vor lesen rbuf: %s\n",rbuf);
    //=====================================================
    	printf("\n===========debug getc_ident1: %s\n",getc_ident1);
    	printf("\n===========debug get_ip1:     %s\n",get_ip1);
    	printf("\n===========debug get_ident1:  %d\n",get_ident1);
    	printf("\n===========debug getc_ident2: %s\n",getc_ident2);
    	printf("\n===========debug get_ip2:     %s\n",get_ip2);
    	printf("\n===========debug get_ident2:  %d\n",get_ident2);
    	printf("\n===========debug getc_ident3: %s\n",getc_ident3);
    	printf("\n===========debug get_ip3:     %s\n",get_ip3);
    	printf("\n===========debug get_ident3:  %d\n",get_ident3);
    //=====================================================
    

    Die ausgabe sieht dan so aus:

    debug vor lesen rbuf: 1 111.22.333.44
    2 222.333.44.55
    3 333.44.555.66

    ===========debug getc_ident1: 123

    ===========debug get_ip1:

    ===========debug get_ident1: 0

    ===========debug getc_ident2: 23

    ===========debug get_ip2: 222.333.44.55

    ===========debug get_ident2: 0

    ===========debug getc_ident3: 3

    ===========debug get_ip3: 333.44.555.66

    ===========debug get_ident3: 0

    Die get_ident´s sollten nur ein Zahlzeichen enthalten...
    _____________________________________________________________________________________

    wenn ich es ein klein wenig umstelle, das er nur einen zeichen einliest:

    //Lese Daten ein
    		sscanf(rbuf,"%c%s%c%s%c%s",&getc_ident1, &get_ip1, &getc_ident2, &get_ip2, &getc_ident3, &get_ip3); 
    		printf("\ndebug vor lesen rbuf: %s\n",rbuf);
    //=====================================================
    	printf("\n===========debug getc_ident1: %s\n",getc_ident1);
    	printf("\n===========debug get_ip1:     %s\n",get_ip1);
    	printf("\n===========debug get_ident1:  %d\n",get_ident1);
    	printf("\n===========debug getc_ident2: %s\n",getc_ident2);
    	printf("\n===========debug get_ip2:     %s\n",get_ip2);
    	printf("\n===========debug get_ident2:  %d\n",get_ident2);
    	printf("\n===========debug getc_ident3: %s\n",getc_ident3);
    	printf("\n===========debug get_ip3:     %s\n",get_ip3);
    	printf("\n===========debug get_ident3:  %d\n",get_ident3);
    //=====================================================
    

    dann gibt er das aus:

    debug vor lesen rbuf: 1 111.22.333.44
    2 222.333.44.55
    3 333.44.555.66

    111.22.333.44ug getc_ident1: 1

    ===========debug get_ip1: 111.22.333.44

    ===========debug get_ident1: 0

    111.22.333.44ug getc_ident2:

    ===========debug get_ip2: 2

    ===========debug get_ident2: 0

    ===========debug getc_ident3: 111.22.333.44

    ===========debug get_ip3: 222.333.44.55

    ===========debug get_ident3: 0

    ka wie ichs dem beibirngen soll... :>

    hat jemand ne idee?



  • hab die lösung
    lag a der initialisierung

    short	get_ident1 = 0;
    	short	get_ident2 = 0;
    	short	get_ident3 = 0;
    	char	getc_ident1[2] = ("0");
    	char	getc_ident2[2] = ("0");
    	char	getc_ident3[2] = ("0");
    	char	get_ip1[16] = ("0");
    	char	get_ip2[16] = ("0");
    	char	get_ip3[16] = ("0");
    

    thx
    h.a.n.l
    have a nice life



  • nichtRegistriert schrieb:

    hab die lösung
    lag a der initialisierung

    Nicht wirklich, nein.
    Sicher dass du für "ident" nur ein Zeichen willst ? Das wären nur 10 maximale Zeilen.
    Machs doch einfach so:

    short ident; 
    char ip[16]; 
    
    printf("\ndebug vor lesen rbuf: %s\n",rbuf); 
    int posBuffer=0;
    int charsRead;
    while(sscanf(&rbuf[posBuffer], " %hd %s%n", &ident, ip, &charsRead) == 2) 
    { 
    	posBuffer += charsRead;
        printf("\n===========debug ident: %hd", ident); 
        printf("\n===========debug ip:    %s", ip); 
        //daten hier verarbeiten 
    }
    

    Ungetestet, sollte aber gehen.

    EDIT:

    Wutz schrieb:

    Mag sein, dein Code ist aber nach wie vor Schrott.

    Genauso wie dieser hier.

    Ups, stimmt wohl. hab den Code überarbeitet.



  • nichtRegistriert schrieb:

    have a nice life

    Mag sein, dein Code ist aber nach wie vor Schrott.



  • DarkShadow44 schrieb:

    while(sscanf(rbuf, "%dh %s ") == 2)
    

    Ungetestet, sollte aber gehen.

    Genauso wie dieser hier.



  • Wutz schrieb:

    falls deine Strings (z.B. Pfad) selbst keine Leerzeichen/Whitespaces enthalten.

    → praxisfern



  • SaiD schrieb:

    nope. hamwa nit. schreib nen kleinen parser, der die eingabe verarbeitet.



  • SaiD schrieb:

    Habt ihr lieben C-Programmierer einen passenden Aufruf von sscanf, der auf dieses Pattern passt?

    nope. hamwa nit. schreib nen kleinen parser, der die eingabe verarbeitet.


Anmelden zum Antworten