c - strtok 的奇怪输出

标签 c arrays

我在处理 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 by s1 into a sequence of tokens, each of which is delimited by a character from the string pointed to by 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;
}

哪个输出(第一列将是下一次迭代使用的搜索字符串,第二列是本次迭代的结果):

[Dog] [Dog]
[Dog] [needs a vet app]
[Dog] [intment.]

第一步工作正常,因为您使用 space 作为分隔符,它通过放置 \0 修改了字符串在 Dog 的末尾.

这意味着下一次尝试(使用错误的长矛)将使用 {D,o,g} 中的一个字母分开。该组的第一个匹配字母是 oappointment这就是为什么你会看到 needs a vet app .第三次尝试没有找到候选字母,因此您只需要取回字符串的其余部分,intment. .

关于c - strtok 的奇怪输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45406279/

相关文章:

mysql - 如何为 AroraDB 5.7.12 转换数组中的字符串?

arrays - 为什么 zsh 中 read -a 失败

arrays - 分隔序列数组中的奇数和偶数索引

c - 如果在 C 中空格后输入的输入无效,如何终止 Scanf()?

c - 一个 friend 给我发了一段我不明白的片段。这是如何运作的?

c++ - 固定大小数组与 alloca(或 VLA)

php - 如何根据与输入单词的相似性对数组进行排序。

c - 一种将字符串打印到文件的有效方法

c++ - 指向限定和非限定类型表示的指针

ruby - 从另一个数组中排除字符串数组元素