Teilstrings kopieren



  • Hi,
    ich will aus einem String Daten extrahieren nur leider gibt er nicht das aus was er soll. Er schreibt in die strings sogar mehr rein als eigentlich geht ?!? Sieht jemand meinen Fehler?

    Gruß HiFish

    Hier der Code:

    char *ptr_user,*ptr_group,*ptr_cput,*ptr_wallt;	
    	       char tmp_user[9],tmp_group[9],tmp_cput[9],tmp_wallt[9];
    		    ptr_user=strstr(zeile,"user=");
    			ptr_group=strstr(zeile,"group=");
    			ptr_cput=strstr(zeile,"resources_used.cput=");
    			ptr_wallt=strstr(zeile,"resources_used.walltime=");
    
    			strncpy(tmp_user,(ptr_user+5),8);
    			strncpy(tmp_group,(ptr_group+5),8);
    			strncpy(tmp_cput,(ptr_cput+20),8);
    			strncpy(tmp_wallt,(ptr_wallt+24),8);
    
    			printf("user: %s group: %s cput: %s wallt: %s\n",tmp_user,tmp_group,tmp_cput,tmp_wallt);
    

    Ausgabe:

    user: atlasng  group: atlas joòatlasng  cput: 00:14:31atlas joòatlasng  wallt: 00:16:27·00:14:31atlas joòatlasng
    

    Das steht in "zeile"

    11/25/2004 00:00:10;E;994986.pbs-server2;user=atlasng group=atlas jobname=dc2_003011_digi queue=long ctime=1101336212 qtime=1101336212 etime=1101336212 start=1101336223 
    exec_host=c01-003-126.gridka.de/0 
    Resource_List.cput=06:36:00 Resource_List.help_run=1 Resource_List.long_e=1 Resource_List.mem=512mb
     Resource_List.ncpus=1 Resource_List.neednodes=1 Resource_List.nodect=1 Resource_List.nodes=1 Resource_List.pcput=10:00:00 
    Resource_List.pvmem=512mb Resource_List.rootfs=1gb 
    Resource_List.tmp=1mb Resource_List.vmem=512mb Resource_List.walltime=07:15:00 session=12567 end=1101337210 Exit_status=0 resources_used.cpupercent=92 
    resources_used.cput=00:14:31 resources_used.mem=356120kb resources_used.ncpus=1 resources_used.vmem=420344kb resources_used.walltime=00:16:27
    

    //Die "Enter" hab ich wegen der Lesbarkeit nachträglich eingefügt.



  • Erstens setzt man: strncpy kein '\0' ans Stringende, wenn der Quellstring dort noch weitergeht (daraus folgt, daß deine Strings in fremdem Speicher fortgesetzt werden - da kannst du recht gut beobachten, wie der Compiler deine Arrays auf dem Stack verteilt hat ;)). Und zweitens könntest du Probleme damit haben, daß einige Einträge des Eingabestrings kürzer sind als 8 Zeichen (z.B. hat der Username nur 7, der Gruppenname sogar nur 5 Zeichen).



  • In dem Manpage zu strncpy steht das nicht mehr wie n Zeichen kopiert werden in dem Fall also 8.
    8 Zeichen is Max. fuer Gruppen- und Benutzername,ich muss mir dann nochwas überlegen wie ich den String verkürze falls ein Leerzeichen eingelesen wird.

    Und wie krieg ich das Programm dazu das es gefälligst nur 8 Zeichen einliest?
    (Habs grad eben mal noch mit memmove und memcpy versucht aber selbes Ergebnis.)

    Edit:Ich glaub ich habs verstanden er liest nur 8 Zeichen ein aber Printf gibt mehr aus wegen des Fehlenden \0 richtig?



  • ich hab mir eine Hilfsfunktion gebastelt:

    char* split(char* str,int i,int j)
    {
    
    int s=0;
    int t=0;
    
    while (str[s] != '\0')
    {
    	if (s >= i && s < j)
    		str[t++] = str[s];
    		s++;
    
    }
    	str[t] = '\0';
    	return str;
    }
    

    gruß
    dominik



  • HiFish schrieb:

    Edit:Ich glaub ich habs verstanden er liest nur 8 Zeichen ein aber Printf gibt mehr aus wegen des Fehlenden \0 richtig?

    Genau richtig erkannt - die char*-Verabeitung in C orientiert sich an den \0 Marken für's Stringende und deshalb bekommst du Probleme, wenn du mit Zeichenfolgen hantierst, die nicht nullterminiert sind.



  • danke Dominik aber ich arbeite es lieber selber aus da lern ich was dabei 😉

    strcat(tmp_group,"\0");
    strcpy(tmp_group[8],"\0");
    

    Irgendwie krieg ich das "\0" nicht in das Array geschrieben

    so habs jetzt hinbekommen danke für die hifle nochmal 🙂



  • Was spricht gegen eine direkte Zuweisung?

    tmp_group[8]='\0';
    

    (PS: auch strcat sucht zunächst nach dem \0, bevor es etwas anhängt - und Leerstrings zu kopieren ("\0" ist aus C-Sicht ein Leerstring) macht gar nichts)


Anmelden zum Antworten