首页 > 解决方案 > 为什么 strtok_r() 只接受字符数组而不接受字符指针

问题描述

当我尝试编译下面的代码时,它编译得很好。

char str[] = "I am Lokesh Kumar. But I liked to be called The Loki";
char *token;
char *p = str;
while (token = strtok_r(p, " ", &p)) {
    cout << token << endl;
}

但是错误[Error] cannot convert 'char ( )[53]' to 'char**' for argument '3' to 'char* strtok_r(char*, const char*, char**)*” 弹出下面的代码

char str[] = "I am Lokesh Kumar. But I liked to be called The Loki";
char *token;
char *p = str;
while (token = strtok_r(str, " ", &str)) {
    cout << token << endl;
}

str并且p都保存第一个字符元素的地址,那么为什么会出现这个错误

标签: c++

解决方案


strtok_rchar指针的地址作为其第三个参数。它将更新此指针以指向匹配的令牌(或其他一些内部使用)。str不是指针,它是 的数组char,您不能将其地址传递给,strtok_r因为数组的地址与指针的地址不同。

混淆来自数组对象自动转换为指向它们的第一个元素的指针,当数组用于大多数表达式上下文时,例如p = str.

数组和指针是非常不同的东西,就像家庭和个人名字一样。一个家庭(数组)是一个人(字符)的集合,一个全名(指针)指向一个人。指向字符的指针类似于一张纸,您可以在纸上写下一个人的名字(人的意义上的字符;)。

也不是这些点:

  • pstrtok_r在将其地址传递给非第一个参数之前不需要初始化NULL
  • p不应strtok_r在后续调用中作为第一个参数传递,
  • 在条件语句中使用赋值表达式作为测试表达式被认为是糟糕的编码风格,您应该将赋值括起来并将值与NULL显式进行比较。

这是一个更正的版本:

char str[] = "I am Lokesh Kumar. But I liked to be called The Loki";
char *token;
char *arg = str;
char *p;

while ((token = strtok_r(arg, " ", &p)) != NULL) {
    printf("%s\n", token);  // using printf since you tagged the question as C
    arg = NULL;
}

推荐阅读