我遇到了一些问题,这些问题涉及来自char *的一系列char *,并将其用作参考:Splitting C char array into words
所以我想要做的就是在char数组中读取并用空格分隔符拆分它们,这样我就可以用它来做。例如,如果我的char *中的第一个标记是" Dog"我会将它发送给处理狗的不同功能。我的问题是我得到了一个奇怪的输出。
例如:
INPUT:* cmd ="狗需要兽医预约。"
输出:(来自打印语句)"完成兽医治疗。"
我使用valgrind检查了内存泄漏,我没有或其他错误。
void parseCmd(char* cmd){ //passing in an individual char* from a char**
char** p_args = calloc(100, sizeof(char*));
int i = 0;
char* token;
token = strtok(cmd, " ");
while (token != NULL){
p_args[i++] = token;
printf("%s",token); //trying to debug
token = strtok(NULL, cmd);
}
free(p_args);
}
有什么建议吗?我是C的新手,所以如果我做了一些愚蠢的话,请耐心等待。谢谢。
答案 0 :(得分:2)
在你的情况下,
token = strtok(NULL, cmd);
不你应该做什么。你需要:
token = strtok(NULL, " ");
根据ISO标准:
char *strtok(char * restrict s1, const char * restrict s2);
对
strtok
函数的一系列调用将s1
指向的字符串分解为一系列标记,每个标记都由由{指向的字符串中的字符分隔。 {1}}。
第一个和后续调用之间的唯一区别(假设,根据这种情况,您需要相同的分隔符)应该使用s2
作为输入字符串而不是实际字符串。通过在后续调用中使用输入字符串作为分隔符列表,可以更改行为。
如果您尝试以下代码,则可以看到完全正在发生的事情:
NULL
哪个输出(第一列将是搜索字符串以使用下一次迭代,第二列是此迭代的结果):
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void parseCmd(char* cmd) {
char* token = strtok(cmd, " ");
while (token != NULL) {
printf("[%s] [%s]\n", cmd, token);
token = strtok(NULL, cmd);
}
}
int main(void) {
char x[] = "Dog needs a vet appointment.";
parseCmd(x);
return 0;
}
第一步工作正常,因为您使用 space 作为分隔符,并通过在[Dog] [Dog]
[Dog] [needs a vet app]
[Dog] [intment.]
末尾放置\0
来修改字符串。
这意味着 next 尝试(使用错误的spearator)将使用Dog
中的一个字母进行拆分。该集合的第一个匹配字母是{D,o,g}
中的o
,这就是您看到appointment
的原因。第三次尝试找到候选字母的 none ,这样您就可以取回字符串的其余部分needs a vet app
。
答案 1 :(得分:0)
token = strtok(NULL, cmd);
应为token = strtok(NULL, " ");
。
第二个参数是delimiter
。