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)