我在处理 char* 数组中的 char* 时遇到了一些问题,并将其用作引用:Splitting C char array into words
所以我想做的是读取 char 数组并用空格分隔符将它们分开,这样我就可以用它做一些事情。例如,如果我的 char* 中的第一个标记是“狗”,我会将它发送到处理狗的不同函数。我的问题是我得到了一个奇怪的输出。
例如:
INPUT: *cmd = "Dog needs a vet appointment."
输出:(来自打印语句)“Doneeds a vet appntment.”
我已经使用 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 的新手,所以如果我做了一些愚蠢的事情,请多多包涵。谢谢。
最佳答案
在你的情况下,
token = strtok(NULL, cmd);
不是您应该做的。相反,您需要:
token = strtok(NULL, " ");
根据 ISO 标准:
char *strtok(char * restrict s1, const char * restrict s2);
A sequence of calls to the
strtok
function breaks the string pointed to bys1
into a sequence of tokens, each of which is delimited by a character from the string pointed to bys2
.
第一次调用和后续调用之间的唯一区别(假设,根据这种情况,您需要相同的分隔符)应该使用 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;
}
哪个输出(第一列将是下一次迭代使用的搜索字符串,第二列是本次迭代的结果):
[Dog] [Dog]
[Dog] [needs a vet app]
[Dog] [intment.]
第一步工作正常,因为您使用 space 作为分隔符,它通过放置 \0
修改了字符串在 Dog
的末尾.
这意味着下一次尝试(使用错误的长矛)将使用 {D,o,g}
中的一个字母分开。该组的第一个匹配字母是 o
在appointment
这就是为什么你会看到 needs a vet app
.第三次尝试没有找到候选字母,因此您只需要取回字符串的其余部分,intment.
.
关于c - strtok 的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45406279/