我正在制作一个非常简单的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);
我该如何解决?
感谢您的咨询。
答案 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。