来自strtok的奇怪输出

时间:2017-07-31 01:15:24

标签: c arrays

我遇到了一些问题,这些问题涉及来自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的新手,所以如果我做了一些愚蠢的话,请耐心等待。谢谢。

2 个答案:

答案 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

  1. http://man7.org/linux/man-pages/man3/strtok.3.html