2016-05-09 35 views
0

Ich frage den Benutzer, welche Umgebungsvariable er wissen möchte, und dann scanne ich es mit scanf. Aber es funktioniert nicht für mich. Hier ist mein Code:C - scanf() und dann getenv()

#include <unistd.h> 
    #include <stdio.h> 
    #include <stdlib.h> 


    int main(int argc, char *argv[]){ 

     char *value; 
     char input; 

     printf("Which variable do you want?\n"); 
     scanf("%s", input); 

     value = getenv(input); 

     printf("%s", value); 

    } 

Der Compiler sagt:

"Funktionsargument Zuordnung zwischen Typen "const char *" und "char" iSt nicht erlaubt"

Also habe ich versucht, Um die Eingabevariable auf: char const *input

Jetzt gibt es keinen Compiler-Fehler, aber wenn ich einen Namen, zum Beispiel "USER", erhalte ich eine "Segmentation fault (core dumped)" Fehler.

+4

'Zeicheneingabe; ... scanf ("% s", Eingabe); '->' Eingabe' ist nicht groß genug, um die Texteingabe zu speichern. (Ähnliches Problem mit http://stackoverflow.com/q/37119782/2410359) – chux

+0

Wenn Sie eine der 'scanf()' -Familien von Funktionen aufrufen, 1) überprüfen Sie immer den zurückgegebenen Wert (nicht den Parameterwert), um den Vorgang zu gewährleisten war erfolgreich.2) Wenn Sie den Eingabe - Konvertierungsspezifizierer '% s' verwenden, verwenden Sie immer einen Modifier 'max length' (also 1 kleiner als die Länge des Eingabepuffers), damit der Benutzer den Eingabepuffer nicht überschreiten kann (was zu undefiniertem Verhalten führen würde) kann zu einem seg fault event führen). BTW: Wie soll man eine Zeichenkette einlesen (NUL-terminiertes Char-Array), wenn der Eingangspuffer nur 1 Zeichen lang ist? – user3629249

+0

in Bezug auf diese Zeile: 'printf ("% s ", value);' die Ausgabe wird im Stdout-Puffer sitzen, bis das Programm beendet wird, dann (und nur dann) wird es tatsächlich auf dem Terminal angezeigt. Es wird dringend empfohlen: 'printf ("% s \ n ", value);' weil '\ n' (newline) bewirkt, dass der stdout-Puffer sofort auf dem Terminal angezeigt wird. – user3629249

Antwort

4

Die Warnung ist, weil hier

value = getenv(input); 

Sie char zu getenv() passieren, der den Prototyp hat:

char *getenv(const char *name); 

definieren input als char-Array wie:

char input[256]; 

    printf("Which variable do you want?\n"); 
    scanf("%255s", input); //specify the width to avoid buffer overflow 

Oder Sie können die dynamische Speicherzuweisung verwenden (mit malloc) wenn Sie denken, 256 ist nicht groß genug für Ihre Zwecke.

1

char ist ein einzelnes char.
char *input deklariert eine Variable, die einen Zeiger auf ein Zeichen enthält, aber es gibt keinen Speicher für die Daten. In C ist dies ein korrektes Verhalten. sscanf erwartet jedoch, dass Sie tatsächlich einen Zeiger übergeben, der auf zugewiesenen Speicher verweist (beachten Sie, dass die Funktion keinen Zeiger zurückgibt, so dass es keine Möglichkeit hat, Speicher für Sie zuzuweisen).

Also zwischen Deklaration und Verwendung, verwenden Sie bitte malloc, um Speicher zuzuweisen.

2

Wenn Sie char *input; definiert Sie den Compiler erfüllen, da die Syntax gilt: wenn scanf("%s", input); rufen Sie sagen, Sie wollen einen String und es sollte platziert bekommen, wo immer input ist.

Das Problem ist input ist nirgendwo (initialisiert) noch ... wo es Punkte ist undefined im Moment; Bevor Sie irgendeinen Zeiger benutzen, müssen Sie ihn irgendwo zeigen, das gültig ist (und groß genug, um alles zu halten, was Sie dort hinlegen wollen).

Es gibt einige Möglichkeiten, wie Sie das lösen können, aber am einfachsten ist es, zu entscheiden, wie groß die Eingabe sein muss, und ein Zeichen-Array zu deklarieren, wie zum Beispiel: char input[512];. Seien Sie sich dessen bewusst, dass dies problematisch ist, denn wenn die Eingabe Ihren Puffer überschreitet, überschreiben Sie anderen Speicher ... aber das sollte Sie jetzt vorwärts bringen.