C - Umgebungsvariabel

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
Benutzeravatar
me
Beiträge: 868
Registriert: 30.10.2005 00:14:23
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Paderborn
Kontaktdaten:

C - Umgebungsvariabel

Beitrag von me » 14.09.2006 00:10:03

Abend,

Ich brauche in C eine variabel ( char natürlich ), die zB als pfad "/home/user/.config" enthält. da user natürlich variabel ist, ich nicht weiss wie ich die systemvariabel bekomme, steh ich da vor einem problemchen. ich hoffe mal mir kann da schnell wer helfen :)
danke.
Anytime if we think we were right,
we were maybe wrong.

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 14.09.2006 00:25:11

getenv

Benutzeravatar
me
Beiträge: 868
Registriert: 30.10.2005 00:14:23
Lizenz eigener Beiträge: GNU General Public License
Wohnort: Paderborn
Kontaktdaten:

Beitrag von me » 14.09.2006 13:32:13

da ich gerade an der arbeit bin und es nicht nachschauen kann, kann ich die fehlermeldung vom gcc nicht nennen. aber folgende snippets funktionieren nicht:

Code: Alles auswählen

char datei = getenv("HOME");
char datei = getenv(HOME");
char datei = (getenv("HOME")/.config;
wobei beim letzteren auch noch ein fehler beim / kommt, den ich allerdings auch nicht mit einem backslash beheben kann.
Anytime if we think we were right,
we were maybe wrong.

Benutzeravatar
mauser
Beiträge: 1854
Registriert: 27.01.2005 22:34:48

Beitrag von mauser » 14.09.2006 13:54:14

hi,

die Signatur von getenv ist

Code: Alles auswählen

char *getenv(const char *name)
. Du bekommst halt ein Pointer auf einen Char zurück und net einen Char..
mfg
mauser

Benutzeravatar
BeS
Moderator
Beiträge: 3236
Registriert: 17.04.2002 18:30:21
Lizenz eigener Beiträge: MIT Lizenz
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von BeS » 14.09.2006 14:05:39

Hallo,
mauser hat ja schon auf ein Problem hingewiesen.
Der zweite Versuch (char datei = getenv(HOME"); ) macht mit nur einem öffnenden Anführungszeichen hinter HOME keinen Sinn.
Das der letzter Versuch (char datei = (getenv("HOME")/.config; ) nicht funktioniert sollte eigentlich auch klar sein, du kannst ja nicht einfach in deinem Quellcode irgendwelche Strings reinschreiben (/.config) die weder ein Schlüsselwort der Programmiersprache noch sonst irgendwelche Variablen, Konstanten usw. sind.

Eine Möglichkeit wäre:

Code: Alles auswählen

char *path = getenv("HOME");
char *file = "/.config";
    
strcat(path, file);

printf("%s\n", path);
Deine Unterstützung für Freie Software kostet dich nur wenige Minuten: www.fsfe.org/support

Ich spreche von Freier Software!

Benutzeravatar
Joghurt
Beiträge: 5244
Registriert: 30.01.2003 15:27:31
Wohnort: Hamburg
Kontaktdaten:

Beitrag von Joghurt » 14.09.2006 14:51:39

strcat überschreibt path. Ein Bufferoverflow ist vorprogrammiert.
besser:

Code: Alles auswählen

#define BUFFER_SIZE 2048
char* filename = malloc(BUFFER_SIZE *sizeof(char)); //falls sizeof(char) mal nicht 1 ist ;)
..
snprintf(filename, BUFFER_SIZE, "%s/%s", getenv("HOME"), ".config");

Antworten