strtok



  • Hallo Zusammen,

    was liefert ein strtok() wenn das Token leer ist?
    Ich habe eine config Datei, die zeilenweise zwei delimeters hat:

    # delim1:"=", delim2:"\n"
    param_name=param_value\n
    

    Mein code zum parsen:

    while( counter++ < CONFIG_PARAM_NO){
        /* get line from config handle */ 
    	fgets( buffer, 128, cfg_h); 
    
        /* lese den "param_name" ein */
    	ptr = strtok(buffer, "="); 
        /* lese den "param_val" ein.. was liefert strtok wenn param_val==""?*/ 
    	ptr = strtok(NULL, "\n"); 
    
    	/* temporaere String, init */ 
    	tmp.s = ptr ;
    	tmp.len = strlen(ptr); 
    
            /* duplicate string structure in the config str array*/ 
    	str_dupl( &tmp, (cfg+counter), TRUE) ;
            ....
    }
    

    Das problem taucht auf, wenn

    param_name=\n
    

    in der config Datei gegeben wird. Dabei erwarte ich in solchen Situationen
    einen NULL Zeiger aus strtok() zurückgeliefert. Das ist aber nicht so, habe
    ausprobiert, ich bekomme einen nicht-NULL zeiger.

    Danke



  • man: strtok gibt erst den Stringpointer (also buffer ) zurück. Erst beim nächsten Aufruf NULL.



  • rüdiger schrieb:

    man: strtok gibt erst den Stringpointer (also buffer ) zurück. Erst beim nächsten Aufruf NULL.

    Mittlerweile denke ich, dass ich besser mit fscanf dran bin. Ich habe die
    offene file stream von dem ich zwei "=" getrennten strings auslesen muss. Wie
    muss der format dafür aussehen?

    [enable_signature]=yes\n
    

    möchte ich in zwei verschiedene Puffern wie "[enable signature]" und "yes"
    einlesen. Ich habe viele verschiedene formats ausprobiert, aber fscanf hat
    immer wieder versagt.

    Versuch:

    fscanf(cfg_h, "%s=%s\n", cfg_parm, cfg_val);
    

    oder

    fscanf(cfg_h, "[%s]=%s\n", cfg_parm, cfg_val);
    

    Woran scheitert fscanf mit solchen Formaten?
    Danke,



  • visitor007 schrieb:

    möchte ich in zwei verschiedene Puffern wie "[enable signature]" und "yes"
    einlesen. Ich habe viele verschiedene formats ausprobiert, aber fscanf hat
    immer wieder versagt.

    So geht's:

    fscanf (cfg_h, "[%[^]]%*2s%s", cfg_parm, cfg_val);
    

    Erklärung:
    Das erste [ ist ja klar. Danach (%[^]]) liest er alles ein, bis auf ein ], wo er auch stoppt. Dann liest er zwei weitere Zeichen ein (] und =), die allerdings, wegen des Sternchens, ignoriert und nicht gespeichert werden. Als letztes kommt dann noch der String mit dem Wert.

    visitor007 schrieb:

    Versuch:

    fscanf(cfg_h, "%s=%s\n", cfg_parm, cfg_val);
    

    oder

    fscanf(cfg_h, "[%s]=%s\n", cfg_parm, cfg_val);
    

    Woran scheitert fscanf mit solchen Formaten?
    Danke,

    Wenn du einen String einliest, hält dieser i.d.R. erst bei einem Whitespace oder nach einer bestimmten (festgelegten) Anzahl von Zeichen.

    Vielleicht hilft dir das: http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

    Gez. monstermunchkin


Anmelden zum Antworten