C-将具有重复定界符char的字符串拆分为2个子字符串

时间:2018-11-13 19:05:28

标签: c strtok

我正在制作一个非常简单的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 :(得分:3)

第二个strtok()不应使用=作为分隔符。仅当还有另一个=结束该值时,您才这样做。但是该值在字符串的结尾处结束。为此部分使用一个空的定界符。

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

答案 1 :(得分:0)

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。