我遇到以下代码:
int get_config(const char *key, char *value) {
FILE *fp = NULL;
char s[100];
char *ret1 = NULL;
char *ret2 = NULL;
fp = fopen(CONFIG_FILE_PATH, "r");
if (fp == NULL) {
perror(CONFIG_FILE_PATH);
return FALSE;
}
while (fgets(s, 100, fp) != NULL) {
//printf("line=%s", s);
ret1 = strstr(s, key);
if (ret1 != NULL) {
ret1 = strstr(s, "=");
if (ret1 != NULL) {
ret1++;
ret2 = strstr(s, "\n");
strncpy(value, ret1, ret2 - ret1);
//printf("ret1=%p ret2=%p\n", ret1,ret2);
value[ret2 - ret1] = 0x0;
printf("config key=%s value=%s\n", key, value);
fclose(fp);
fp = NULL;
ret1 = NULL;
ret2 = NULL;
return TRUE;
}
}
}
我很难理解ret1++
的作用。如果我正确理解strstr()
,ret1 = strstr(s, "=");
之后ret1将包含s中=符号后面的所有内容。
让我们假设这不是一个数字,而是一个单词"值",结果为ret1 = value
这对ret1++
意味着什么?
也许我对CONFIG_FILE_PATH的假设是错误的,并且数字总是在等号后面。
旁注:
我只是希望,我知道CONFIG_FILE_PATH的样子。但是#define CONFIG_FILE_PATH "/etc/config/duvs.conf"
但是这条路径可能位于设备上,这个程序是为...编写的:/
答案 0 :(得分:0)
ret1
是指针。
我认为你的变量s
是" dir=/my/path
"。
值指向到角色。在您的示例中,如果" =" strstr(s, "=");
将返回NULL。尚未找到或其指针在字符串内。含义ret1
包含一个字符串,其中包含文本的其余部分,包括" =" (我的例子中是=/my/path
)。通过递增1个字符(ret++
),指针现在指向同一个字符串后面的一个字符:/my/path
。
这是使用指针的C代码的基础知识,因为字符串实际上不是语言的一部分,而只是内存数据。
答案 1 :(得分:0)
ret1 = strstr(s, "=");
之后,ret1将包含所有内容 跟随s中的=符号。
你是对的。
我们假设s
是字符串enable=false\n
。
ret1
加ret1++
后,它指向字符f
。
在语句ret2 = strstr(s, "\n");
之后,指针ret2
指向字符\n
。
ret2 - ret1
等于5,即子串false
的长度。对于指针算术,this article可能对您有帮助。
在strncpy(value, ret1, ret2 - ret1);
之后,value
的内容是字符串false
。
编辑:
使用CONFIG_FILE_PATH
指定的配置文件可能如下所示:
timeout=30
enable=false
priority=5
log=/var/log/mylogfile
...