簡體   English   中英

環境變量 C

[英]Environment variables C

我必須編寫一個帶有菜單的程序。 用戶可以鍵入 0 到 5 之間的數字。0 結束程序。 1 列出所有環境變量,2 打印一個條目,3 添加一個條目,4 修改條目,5 刪除條目。

當我列出程序崩潰的所有變量時:“進程以退出代碼 139 完成(被信號 11 中斷:SIGSEGV)”

當我想打印一個環境變量時, getenv()不會找到任何東西,盡管它們存在。

這是我的代碼。 如果還有什么需要幫助我的,請告訴我。

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

extern char **environ;

long getMenue(char Menuetitel [50], char Menupunkte[10][100], int Anzahl){

    char* buffer;
    size_t bufsize = 32;
    int i = 0;
    long Auswahl;
    int ok = 0;

    buffer = (char*) malloc(bufsize * sizeof(char));
    if (buffer == NULL){

        perror("malloc failed\n");
        exit(1);
    }

    printf("---------------------\n");
    printf("%s\n", Menuetitel);
    printf("---------------------\n");

    while(i < Anzahl){

        printf("%s\n", Menupunkte[i]);
        i++;

    }

    while(ok == 0){
        char* pEnd;
        printf("\nIhre Wahl: ");
        getline(&buffer,&bufsize,stdin);

        Auswahl = strtol(buffer, &pEnd, 10);

        if(Auswahl < 0 || Auswahl > Anzahl){
            printf("Falsche Eingabe. Bitte geben Sie eine Zahl zwischen 0 und 5 ein\n");
            ok = 0;
        }else{
            ok=1;
        }


    }

    return Auswahl;
}
void printList(){
    int i = 0;
    while(*environ){

        puts(*(environ+i));
        i++;
    }

}
void printEntry() {
    char *buffer;
    size_t bufsize = 32;
    size_t characters = 0;
    char * ausgabe;

    buffer = (char *) malloc(bufsize * sizeof(char));
    if (buffer == NULL) {

        perror("malloc failed\n");
        exit(1);
    }
    while (!characters){
        printf("Welchen Eintrag möchten Sie ausgeben?");
        characters = getline(&buffer, &bufsize, stdin);
        ausgabe = getenv(buffer);
        printf("%s\n", buffer);

        if(!characters)
            printf("Bitte geben Sie etwas ein\n");
        else if( ausgabe == NULL)
            printf("Kein Treffer bitte noch einmal versuchen \n");
        else {
            printf("%s = %s\n", buffer, ausgabe);
        }

    }
}
void Add(){
    char *buffer;
    size_t bufsize = 32;
    size_t characters = 0;

    buffer = (char *) malloc(bufsize * sizeof(char));
    if (buffer == NULL) {

        perror("malloc failed\n");
        exit(1);
    }


    while(!characters){
        printf("Bitte geben Sie ein, was Sie hinzufügen möchten: ");
        characters = getline(&buffer, &bufsize, stdin);
        if(characters == 0){
            printf("Bitte geben Sie etwas ein\n");
        }else if (putenv(buffer) != 0){
            printf("Putenv() hat nicht funktioniert. Versuchen Sie es erneut\n");
        }
    }
}

void modify(){
    char *buffer;
    size_t bufsize = 32;
    size_t characters = 0;
    char * comp;

    buffer = (char *) malloc(bufsize * sizeof(char));
    if (buffer == NULL) {

        perror("malloc failed\n");
        exit(1);
    }

    while(!characters){

        printf("Welche Variable möchten Sie verändern?");
        characters = getline(&buffer, &bufsize, stdin);
        comp = getenv(buffer);
        if(!characters)
            printf("Bitte geben Sie etwas ein\n");
        else if( comp != NULL){
            setenv(comp, buffer, 1 );
        }else{
            printf("diese Variable gibt es noch nicht\n");
        }
    }
}

void removeEntry(){
    char *buffer;
    size_t bufsize = 32;
    size_t characters = 0;
    char * comp;

    buffer = (char *) malloc(bufsize * sizeof(char));
    if (buffer == NULL) {

        perror("malloc failed\n");
        exit(1);
    }

    while(!characters){

        printf("Welche Variable möchten Sie löschen?\n");
        characters = getline(&buffer, &bufsize, stdin);
        comp = getenv(buffer);
        if(!characters)
            printf("Bitte geben Sie etwas ein\n");
        else if( comp != NULL){
            unsetenv(comp);
        }else{
            printf("diese Variable gibt es noch nicht\n");
        }
    }
}



void environment(){

    long Auswahl =1;

    char Menupunkte[10][100]= {

        "[1]: Print environment list",
        "[2]: Print environment entry",
        "[3]: Add environment entry",
        "[4]: Modify environment entry",
        "[5]: Remove environment entry",
        "[0]: End"
    };


    while (Auswahl != 0){

        Auswahl = getMenue("Environment-List Menu", Menupunkte, 6 );

        switch(Auswahl){

            case 1 : printList(); break;
            case 2 : printEntry(); break;
            case 3 : Add(); break;
            case 4 : modify(); break;
            case 5 : removeEntry(); break;
            case 0 : printf("Programm wird beendet\n"); break;
            default: printf("Falsche Eingabe\n"); break;
        }
    }
    exit(EXIT_SUCCESS);
}

int main() {

    environment();

}

您的PrintList例程中的問題是讀取的行

  while(*environ){

在此例程中,您不會更改指針environ ,因此*environ是一個常量 - 它是environ指向的指針數組中的第一個條目。 將此更改為

while(*(environ+i)){

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM