Problem mit strchr
-
Hallo!
Ich muss auf Ubuntu Linux die Funktionen getenv(),... selber implementieren.
Allerdings habe ich ein Problem mit strchr. Denn wenn ich den jeweiligen Abstand im Array berechnen will, bekomme ich irgendeine Zahl und darauffolgend dann ein segmentation fault:#include <string.h> ... extern char**environ; char* findname(const char* name, char** value) { int i; char * pName; char temp[MAXLEN]; memset(temp,'\0',sizeof(temp)); size_t found=0; for(i=0;environ[i]!=0; i++) { if(pName=strchr(environ[i], '=') ==0) //laut debugger zeigt pname immer noch auf 0x00 fprintf(stderr, "error in environment list!\n"); else { found=pName-environ[i]; //hier kommt jetzt daher irgendeine Zahl raus //strncpy(temp, environ[i],found); //sollte eigentlich nur bis zum = zeichen kopieren if(strcmp(temp,name)==0) { return environ[i]; } } } return 0; }
Seht ihr vielleicht woran das liegen könnte?
mfg
ACnut
-
if(pName=strchr(environ[i], '=') ==0) //laut debugger zeigt pname immer noch auf 0x00
pName erhält den Wert des Vergleichs (true/false). Es fehlt eine Klammer:
if((pName=strchr(environ[i], '=')) ==0)
- osdt
-
Das
(pName=strchr(environ[i], '=') ==0)
macht nicht das, was du möchtest.== ist in der Rangfolge über =
Wenn du die Funktion testen willst, dann gib ihr
environ
als dritten Paramter mit und rufe sie mit Testdaten auf.Und nimm, wo es angebracht ist, NULL statt 0.
-
DirkB schrieb:
Das
(pName=strchr(environ[i], '=') ==0)
macht nicht das, was du möchtest.== ist in der Rangfolge über =
Wenn du die Funktion testen willst, dann gib ihr
environ
als dritten Paramter mit und rufe sie mit Testdaten auf.Und nimm, wo es angebracht ist, NULL statt 0.
ihr beide habt Recht, danke
kannst du mir auch sagen wieso ich eher NULL statt 0 verwenden soll? Ich habe noch in Erinnerung (letztes Jahr zu dieser Zeit gehört), dass das NULL compilerspezifisch oder systemspezifisch (jeder hat seie eigene Definiton von NULL) ist und mit 0 man auf der sichereren Seite ist
kann auch sein, dass ich das mit einem anderen thema verwechsle
-
NULL bei Zeigern
0 bei Zahlenwerten.strchr liefert einen Zeiger. Darum Vergleich mit NULL.
strcmp liefert einen Zahlenwert. Darum 0.
Der letzte Eintrag im Environment ist ein NULL-Zeiger.Es geht auch um die Lesbarkeit.
Und wenn ich das so sehe wie bei dir, dann weiß ich, dass der Programmierer keine Ahnung hat.
-
zwar weiß ich nicht was du mit dem letzten satz meinst bzw. worauf du dich beziehst :D, aber ich werde in Zukunft mehr auf 0-NULL achten
danke