2017-08-09 71 views
0

我面臨着下面的代碼:遞增char值(大於一個字母)

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

你在說什麼? 'ret1'指向'='後面的C字符串(可能是空字符串)或者等於NULL。 –

+0

Mybe我很困惑,因爲這裏的描述: https://www.tutorialspoint。com/c_standard_library/c_function_strstr.htm 在下面提供的示例中,'ret'等於'Point',這導致我認爲,在我的情況下'ret1'也等於一個字符串。因此,讓我不明白,'ret1 ++'是多少有道理的。 :) – user3554329

回答

0

ret1是一個指針。

我supposer你的變量s是「dir=/my/path」。

的字符。在你的例子中,strstr(s, "=");如果沒有找到「=」或者它在字符串中的指針,則返回NULL。含義ret1包含一個字符串,其餘文本爲,包括「=」(在我的示例中爲=/my/path)。通過遞增1個字符(ret++),指針現在指向在/my/path之後的一個字符的同一個字符串。

這是使用指針的C代碼的基礎知識,因爲字符串實際上不是語言的一部分,而只是內存數據。

+0

謝謝你的解釋。在指針方面我真的沒有經驗。因此沒有理解'ret1 ++'=指向字符串中下一個字符的想法。 – user3554329

0

ret1 = strstr(s, "=");之後ret1將包含s之後的=號之後的所有內容 。

你說得對。 我們假設s是字符串enable=false\nret1ret1++後遞增後,指向字符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 
... 
+0

非常感謝這個視覺例子。我的一個問題是,無法想象s(因此CONFIG_FILE_PATH)是怎麼樣的,因爲我真的沒有經驗的程序員。 – user3554329

+0

@ user3554329我認爲這是一個基於鍵值的配置文件。其內容可能是這樣的:'key = value'。這是一個例子:https://en.wikipedia.org/wiki/Configuration_file#MS-DOS – haolee