【问题标题】:Incrementing char value (more than one letter)递增 char 值(超过一个字母)
【发布时间】:2017-08-09 07:44:13
【问题描述】:

我遇到以下代码:

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"但是这个路径很可能是位于设备上的,这个程序是为...写的:/

【问题讨论】:

  • 你在说什么? ret1 指向 = 之后的 C 字符串(可能是空字符串)或等于 NULL
  • Mybe 由于这里的描述,我很困惑:tutorialspoint.com/c_standard_library/c_function_strstr.htm 在下面提供的示例中,ret 等于 Point,这让我假设,在我的情况下,ret1 也等于一个字符串。因此让我不明白,ret1++ 有什么意义。 :)

标签: c++ string char increment strstr


【解决方案1】:

ret1 是一个指针。

我想你的变量 s 是“dir=/my/path”。

指向字符。在您的示例中,strstr(s, "="); 如果未找到“=”或其在字符串中的指针,则返回 NULL。含义ret1 包含一个字符串,其余文本包括“=”(在我的示例中为=/my/path)。通过增加 1 个字符 (ret++),指针现在指向同一字符串后一个字符:/my/path

这是使用指针的 C 代码的基础,因为字符串并不是语言的一部分,而只是内存数据。

【讨论】:

  • 感谢您的解释。在指针方面,我真的很缺乏经验。因此没有t understand the idea of ret1++` = 指向字符串中的下一个字符。
【解决方案2】:

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
...

【讨论】:

  • 非常感谢您提供这个视觉示例。我的一个问题是,无法想象 s(以及因此 CONFIG_FILE_PATH)的样子,因为我真的是缺乏经验的程序员。
  • @user3554329 我认为这是一个基于键值对的配置文件。它的内容可能是这样的:key=value。这是一个例子:en.wikipedia.org/wiki/Configuration_file#MS-DOS
猜你喜欢
  • 2016-09-25
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
  • 2015-11-16
  • 2016-09-05
  • 1970-01-01
  • 1970-01-01
  • 2013-09-24
相关资源
最近更新 更多