c-将值追加到结构并打印它



我刚刚开始使用structs,我正试图将变量名及其内容附加到structvariables中。例如

输入:

PATH,getenv("PATH"(

输出:

变量名称:PATH

Var内容:/usr/sbin

这是我的结构声明

int var_counter = 0; 
typedef struct ENV_VARIABLES
{
char var_name[MAX_VAR_NAME]; // Stored the Variable Name ie PATH
char var_content[MAX_SIZE]; // Stores the Variable Contents ie homebinshell...
}env_variable;
env_variable *env_vars;

在这里,我将参数传递给environmentVars((,然后打印它们。

void iniEnvVars()
{
environVars("PATH", getenv("PATH"));
environVars("PROMPT", shellname);
environVars("CWD", getcwd("CWD", MAX_ARGS));
environVars("USER", getenv("USER"));
environVars("SHELL", "/home/.../");
environVars("TERMINAL", ttyname(STDIN_FILENO));
environVars("EXITCODE", EXITCODE);
printVars();
}

在这里,我将内容添加到结构中。

int environVars(char *env_name, char *env_content)
{
// First we want to check if there are any stored items in the struct
// If there isnt, we store the first env_name and its contents; 
// Else, we check if it is there, else we add it to the struct. 
// If it is already there we modify its contents. 
if(var_counter == 0)
{    
var_counter++;
env_vars = calloc((size_t)var_counter, sizeof(env_variable));
strcpy(env_vars[var_counter].var_name, env_name);
strcpy(env_vars[var_counter].var_content, env_content);

}
else
{
for(int i = 0; i < var_counter; i++)
{
if(strcmp(env_name, env_vars[i].var_name) == 0)
{
printf("Foundn");
printf("Modifying Variable Contentsn");
strcpy(env_vars[i].var_content, env_content);
break;
}
else
{   
var_counter++;
env_vars = realloc(env_vars,(var_counter)*sizeof(env_variable));
strcpy(env_vars[i].var_name, env_name);
strcpy(env_vars[i].var_content, env_content);
break;

}
}
}
return 1;
}

我在这里打印。

void printVars()
{
if(var_counter == 0)
{
printf("There are no Enviromental Variables stored.n");
}
else
{
for(int i = 0; i < var_counter; i++)
{
printf("Var Name: %snn ", env_vars[i].var_name);
printf("Var Contents: %snn ", env_vars[i].var_content);
}
}
}

我使用了calloc和realloc,但我不太确定我是否应该使用malloc。

出现的错误是它没有打印任何内容。我确实运行了一次调试,同样的事情也发生了。没有打印任何内容。

Bug#1:

if(var_counter == 0)
{    
var_counter++;
env_vars = calloc((size_t)var_counter, sizeof(env_variable));
strcpy(env_vars[var_counter].var_name, env_name);
strcpy(env_vars[var_counter].var_content, env_content);

}

var_counter为零时实际发生的情况是:

var_counter = 1;
env_vars = calloc(1, sizeof(env_variable));
strcpy(env_vars[1].var_name, env_name);
strcpy(env_vars[1].var_content, env_content);
^
oh dear

您正在分配的内存之外写入

应该是:

strcpy(env_vars[0].var_name, env_name);
strcpy(env_vars[0].var_content, env_content);

错误#2:

for(int i = 0; i < var_counter; i++)
{
if(strcmp(env_name, env_vars[i].var_name) == 0)
{
printf("Foundn");
printf("Modifying Variable Contentsn");
strcpy(env_vars[i].var_content, env_content);
break;
}
else
{   
// YOU DON'T WANT THIS !!
var_counter++;
env_vars = realloc(env_vars,(var_counter)*sizeof(env_variable));
strcpy(env_vars[i].var_name, env_name);
strcpy(env_vars[i].var_content, env_content);
break;

}
}

else一次又一次地重新分配和覆盖旧条目。你不想那样。

else中的代码应在循环之后。并且仅在循环中未找到匹配项的情况下执行。

最新更新