gpt4 book ai didi

c - 外部关键字和设置字符串变量

转载 作者:太空宇宙 更新时间:2023-11-04 03:55:18 25 4
gpt4 key购买 nike

我有一个声明为 extern conf_t conf 的结构。

typedef struct {
int home_dir_len;
char *home_dir;
int key_file_len;
char *key_file;
unsigned int max_mem;
unsigned int runtime;
} conf_t;

我试图通过下面的函数设置它的变量,但是只设置了整数值,而不是字符串。

if (strcmp(tok1, "HOME_DIR") == 0) {
char *dir = strtok(NULL, &delim);
conf.home_dir_len = strlen(dir);
conf.home_dir = dir;
}
else if (strcmp(tok1, "KEY_FILE") ==0) {
char *key = strtok(NULL, &delim);
conf.key_file_len = strlen(key);
conf.key_file = calloc(conf.key_file_len +1, sizeof(char));
conf.key_file = key;
}
else if (strcmp(tok1, "MAX_MEM") ==0) {
conf.max_mem = atoi(strtok(NULL, &delim));
}
else if (strcmp(tok1, "RUNTIME") ==0) {
conf.runtime = atoi(strtok(NULL, &delim));
}
else {
perror("you shouldnt be here");
}

这是输出:

conf.home_dir_len = 5
conf.home_dir = ' and more empty lines
' **This should be /tmp/**
conf.key_file_len = 10
conf.key_file = 'nd more empty lines
' **this should be myfile.key**
conf.max_mem = 10
conf.runtime = 10

能否请您解释一下原因以及我该如何纠正?

最佳答案

在执行 char * 赋值的每个 if(condition) 中,很明显 strtok() 正在处理的字符串是仅供暂时引用。您需要为您的结构形成字符串的副本。您在 conf.key_file = 中部分执行了该操作(您分配了数据,但未复制字符串),但在 conf.home_dir = 中未执行此操作。推荐:

// delete  conf.home_dir = dir;
conf.home_dir = strdup(dir);
...
// delete conf.key_file = calloc(conf.key_file_len +1, sizeof(char));
// delete conf.key_file = key;
conf.key_file = strdup(key);

正如@Carl Norum 指出的那样,需要更多代码。所以虽然上面的思路可以解决问题。如果没有额外的代码,它可能只是部分解决方案。

strdup(s) 做了 3 件事。它为 s 的副本分配了足够的内存,比如“s2”。它将's'复制到s2。然后返回“s2”。

关于c - 外部关键字和设置字符串变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16952007/

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