C - разбить строку с повторяющимся символом-разделителем на 2 подстроки - PullRequest
0 голосов
/ 13 ноября 2018

Я делаю очень простую программу на C, которая имитирует команду export , получая ввод с помощью функции fgets ().

Пример ввода:

KEY = VALUE

Необходимо преобразовать в:

setenv("KEY", "VALUE", 1);

Это легко решить с помощью чего-то похожего на этот код:

key = strtok(aux, "=");
value = strtok(NULL, "=");

Проблема возникаеткогда пользователь вводит значение, начинающееся с одного или нескольких символов, равное = символов.Например:

KEY === VALUE

Это должно быть преобразовано в:

setenv("KEY", "==VALUE", 1);

Но с моим текущим кодом оно преобразуется в:

setenv("KEY", NULL, 1);

Как мне решить эту проблему?

Спасибо за совет.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

strtok, вероятно, является избыточным (и не реентерабельным), когда это всего один токен.Это будет делать,

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

int main(int argc, char **argv) {
    char *key, *equals, *value;
    if(argc != 2 || !(equals = strchr(key = argv[1], '=')))
       return fprintf(stderr, "KEY=VALUE\n"), EXIT_FAILURE;
    value = equals + 1;
    *equals = '\0';
    printf("key: <%s>; value: <%s>.\n", key, value);
    return EXIT_SUCCESS;
}

Хотя strtok, вероятно, легче читать.Можно попробовать strsep, но это GNU C.

0 голосов
/ 13 ноября 2018

Ваш второй strtok() не должен использовать = в качестве разделителя. Вы бы сделали это, только если бы был еще один =, который закончил значение. Но значение заканчивается в конце строки. Используйте пустой разделитель для этой части.

key = strtok(aux, "=");
value = strtok(NULL, "");
...