c++ - 为什么 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
都保存第一个字符元素的地址,那么为什么会出现这个错误
解决方案
strtok_r
将char
指针的地址作为其第三个参数。它将更新此指针以指向匹配的令牌(或其他一些内部使用)。str
不是指针,它是 的数组char
,您不能将其地址传递给,strtok_r
因为数组的地址与指针的地址不同。
混淆来自数组对象自动转换为指向它们的第一个元素的指针,当数组用于大多数表达式上下文时,例如p = str
.
数组和指针是非常不同的东西,就像家庭和个人名字一样。一个家庭(数组)是一个人(字符)的集合,一个全名(指针)指向一个人。指向字符的指针类似于一张纸,您可以在纸上写下一个人的名字(人的意义上的字符;)。
也不是这些点:
p
strtok_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;
}
推荐阅读
- python - Pandas 读取 csv,列名分布在多行中
- javascript - 如何在js中显示来自json的对象
- javascript - 通过 javascript 访问车把对象变量
- decentralized-identity - 我在哪里可以找到分散标识符的示例
- python - python re.findall 和 re.sub
- python - 逐步迭代数据帧的行
- python - 如何从 Python 中的多个列中提取多个编码值?
- angular - 新上传的照片出现 404 错误。如果我停止然后运行网站,图像会加载
- firebase - 有没有办法将 Firebase Analytics 事件发送到自定义端点(与 Google Analytics for WEB 一样)
- c# - MathNet - 防止分母中的零值