【问题标题】:Appending values to a struct and printing it将值附加到结构并打印它
【发布时间】:2021-06-29 10:29:08
【问题描述】:

我刚刚开始使用结构,我正在尝试将变量名称及其内容附加到结构变量中。例如。

输入:

PATH, getenv("PATH")

输出:

变量名称:PATH

变量内容:/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 \home\bin\shell...

}env_variable;

env_variable *env_vars;

这里我将参数传递给 environVars() 然后打印它们。

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("Found\n");
                printf("Modifying Variable Contents\n");
                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: %s\n\n ", env_vars[i].var_name);
            printf("Var Contents: %s\n\n ", env_vars[i].var_content);
        }
    }
}

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

发生的错误是它没有打印任何东西。 我确实运行了调试,并且发生了同样的事情。什么都没有打印。

【问题讨论】:

  • 不确定是否是您的问题,但您需要查看所有现有的变量,然后再决定添加一个新变量。
  • var_counter 似乎未定义...您忘记发布定义了吗?

标签: c linux shell


【解决方案1】:

错误 #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("Found\n");
            printf("Modifying Variable Contents\n");
            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 中的代码应该在循环之后。并且只有在没有找到匹配的循环中才会被执行。

【讨论】:

  • 所以,我应该在输入后递增,否则我可以 strcpy(env_vars[var_counter-1].var_name, env_name);
  • @AlfredGrech 或减一...但请注意 calloc 需要一个非零值
猜你喜欢
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-06
  • 2012-12-13
  • 2022-01-25
相关资源
最近更新 更多