[英]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.