парсинг строки конфигурации с использованием strtok в C - PullRequest
0 голосов
/ 17 июня 2010

в файле конфигурации у меня есть записи, подобные этой:

filepath = c: \ Program Files \ some value

Где путь может содержать пробелы, и на нем нет кавычекстрока.Я попытался проанализировать это с помощью strtok, например:

char *option;
char *value;

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

, где строка - это строка, которую я читаю из файла, опция будет содержать левую часть равенства (filepath), а значение будет содержать правую сторону (c: \ программные файлы \ некоторое значение).Я знаю, это плохое кодирование, но я не нашел что-то лучшее.извините ... В любом случае, для тех опций, где в правой части нет пробела, он прекрасно работает, но в тех, которые содержат пробелы, он возвращает только строку до 1-го пробела: c: \ Program.

IsЕсть ли другой способ сделать это?

Код приветствуется.Джессика

Ответы [ 5 ]

0 голосов
/ 17 июня 2010

Это должно сделать это:

#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 взята из здесь

0 голосов
/ 17 июня 2010

Использование 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 голосов
/ 17 июня 2010

Здесь: strtok (line, "=")

Вы говорите, что разделите на пробел AND =.Потеряйте место и обрежьте свои результаты, если это будет необходимо.

0 голосов
/ 17 июня 2010

Вы можете использовать strtok_r () и использовать указатель, который он дает вам для остальной части строки.

char *rightside;
char *leftside;

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

Обратите внимание, что это уничтожит ваш "строковый" буфер,но обычно это не имеет большого значения, если вы все равно просто читаете новые данные.

0 голосов
/ 17 июня 2010

Убрать пробел в разделителе:

value = strtok(line, "=");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...