2010-06-17 80 views
0

我有類似這樣的一個條目的配置:解析串關在配置文件中使用的strtok用C

文件路徑= C:\ Program Files文件\一些價值

所在路徑可以包含空格和有在該字符串上沒有引號。

char *option; 
char *value; 

value = strtok(line, " ="); 
strcpy(option, value); 
value = strtok(NULL, " ="); 

其中線是我從文件中讀取行,選項將包括相等(文件路徑)的左側和值將包含右側(C:我試圖像strtok的解析這個\程序文件\一些值)。 我知道,這是糟糕的編碼,但我還沒找到更好的東西。對不起... 在任何情況下,對於那些右側沒有空格的選項,它的效果很好,但是在那些包含空格的選項中,它只會返回字符串,直到第一個空格:c:\ Program。

有沒有其他方法可以做到這一點?

代碼表示讚賞。 傑西卡

+1

的第二個參數的strtok採取給人一種數量的分隔符,每個將分割字符串。所以「=」會在空間或等號上分割。 – Sjoerd 2010-06-17 18:49:10

回答

0

定界符刪除空格:

value = strtok(line, "="); 
+0

然後它崩潰。 – Jessica 2010-06-17 18:53:03

+0

哎呀,對不起我的壞。它正在其他地方崩潰。 – Jessica 2010-06-17 18:58:50

0

這裏: 的strtok(行, 「=」)

你是說拆就空間和=。如果需要的話,丟掉空間並修剪你的結果。

0

您可以使用strtok_r(),並使用它爲您提供的剩餘字符串指針。

char *rightside; 
char *leftside; 

leftside = strtok_r(line, "=", &rightside); 

注意,這將毀掉你的「線」緩衝區,但通常這不是一個大問題,如果你只是讀新數據也無妨。

0

使用sscanf()

char * conf = "filepath = c:\\Program Files\\some value"; 
char key[20]; 
char value[40]; 
sscanf(conf, "%s = %40c", key, value); 
printf("key: %s value: %s\n", key, value); 
+0

'sscanf'很危險,應該避免! (http://www.dwheeler.com/secure-programs/Secure-Programs-HOWTO/dangers-c.html) – 2010-06-17 19:09:14

+0

我已經指定'value'最多可以有40個字符,所以它不會溢出。我認爲'key'也是一樣的。這可以防止緩衝區溢出。 – Sjoerd 2010-06-17 20:47:07

0

這應做到:

#include <stdlib.h> 
#include <stdio.h> 

#define INPUT_FILE "test.txt" 
#define BUF_SIZE 1024 
#define SEP " = " 

#define CHECK(x) \ 
    do { \ 
     if (!(x)) { \ 
      fprintf(stderr, "%s:%d: ", __func__, __LINE__); \ 
      perror(#x); \ 
      exit(-1); \ 
     } \ 
    } while (0) \ 

void trim(char *s) { 
    // Trim spaces and tabs from beginning: 
    int i = 0, j; 
    while((s[i]==' ') || (s[i]=='\t')) { 
     i++; 
    } 
    if(i > 0) { 
     for(j = 0; j < strlen(s); j++) { 
      s[j] = s[j+i]; 
     } 
    s[j] = '\0'; 
    } 

    // Trim spaces and tabs from end: 
    i = strlen(s) - 1; 
    while((s[i]==' ') || (s[i]=='\t') || (s[i]=='\r') || (s[i]=='\n')) { 
     i--; 
    } 
    if(i < (strlen(s) - 1)) { 
     s[i+1] = '\0'; 
    } 
} 

int main() { 
    FILE *f; 
    char line[BUF_SIZE + 1]; 
    char *opt, *val; 

    line[BUF_SIZE] = '\0'; 

    f = fopen(INPUT_FILE, "rt"); 
    CHECK(f != NULL); 

    while (NULL != fgets(line, sizeof(line), f)) { 
     printf("%s", line); 

     opt = strstr(line, SEP); 
     if (!opt) { 
      continue; 
     } 

     *opt = '\0'; 
     val = opt + strlen(SEP); 
     opt = line; 

     trim(opt); 
     trim(val); 

     printf("opt=<%s> val=<%s>\n", opt, val); 
    } 
    fclose (f); 

    return 0; 
} 

trim功能從here