gpt4 book ai didi

c - Unix 上的 putenv() 和 setenv()

转载 作者:行者123 更新时间:2023-11-30 20:35:08 25 4
gpt4 key购买 nike

我需要从用户那里获取输入并处理变量。我需要具备以下功能:

  • set varname = somevalue:将名为varname的环境变量的值设置为somevalue指定的值。
  • delete varname:删除指定的环境变量。
  • print varname:打印出指定环境变量的当前值。

到目前为止我所拥有的是:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <readline/readline.h>
#include <readline/history.h>

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

char * s;
char * command;
char * varName;
char * varValue;

while (s = readline("prompt> ")) {
/* Initialise char* variables */
command = NULL;
varName = NULL;
varValue = NULL;

add_history(s); /* adds the line to the readline history buffer */

printf("> %s\n", s); //print > sign

int cmdNo = 1;
int i;

// parse through entire string
for (i = 0; i < strlen(s); i++)
{
// check for space or = and jump over it
while ((isspace(s[i]) || s[i] == '=') && (i < strlen(s)))
{
i++;
}
// check if i is greater than string size
if (i >= strlen(s))
{
printf("Bad command format!\n");
break;
}
// if cmdNo == 1, get the command
if (cmdNo == 1)
{
int commandSize = 0;

int index = i;

// point index to space
while (!isspace(s[index]))
{
commandSize++;
index++;
}

// get command
command = (char*)malloc(commandSize + 1);

int destIndex = 0;

// copy command into command array
while (i<index)
{
command[destIndex] = s[i];
destIndex++;
i++;
}

// adding terminate character
command[destIndex] = '\0';
// increase command number by 1
cmdNo++;

}
// if cmdNo == 2 we deal with variable name
else if (cmdNo == 2)
{
// variable name size
int varNameSize = 0;
int index = i;
// point index to space
while (!isspace(s[index]))
{
varNameSize++;
index++;
}

// get var name
varName = (char*)malloc(varNameSize + 1);

int index2 = 0;
while (i<index)
{
varName[index2] = s[i];
index2++;
i++;
}
// add terminate char
varName[index2] = '\0';
// increment cmdNo by 1
cmdNo++;
}
// if cmdNo == 3 we deal with variable value
else if (cmdNo == 3)
{
int valueSize = 0;
int index = i;
// point index to space
while (!isspace(s[index]) && s[index] != '\0')
{
valueSize++;
index++;
}

// get variable value
varValue = (char*)malloc(valueSize + 1);
int index2 = 0;
while (i<index)
{
varValue[index2] = s[i];
index2++;
i++;
}
// add terminate char
varValue[index2] = '\0';
}
}
// print command, variable name and value
if (command != NULL)
{
printf("%s", command);
}
if (varName != NULL)
{
printf(" %s", varName);
}
if (varValue != NULL)
{
printf(" %s\n", varValue);
}

/* clean up! */
free(s);
free(command);
free(varName);
free(varValue);
}
return(0);
}

显然,我必须把 putenv()setenv()clearenv() 放在某个地方。我对这些命令没有太多经验。

此外,还有一些错误(段错误)。这是系统的响应 enter image description here

最佳答案

崩溃是由 cmdNo 1 和 2 的循环 while (!isspace(s[index])) 引起的 - 如果没有第三个(或第二个) ) 输入行上的单词,它们将越过字符串中的 NUL 终止符并且(可能)崩溃。在检查 cmdNo 3 情况时,您需要在这些循环中检查 NUL。

如果输入行上的单词超过 3 个,您也会遇到问题 - 在第 4 个单词上您将进入无限循环。

而不是像您所做的那样在 if/else if/else if 中复制单词的代码,最好将数组中的单词。您甚至可以使用 strtok_rstrsep 而不是手动解析字符。

关于c - Unix 上的 putenv() 和 setenv(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40383207/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com