我发现自己再次被C字符串,字符等混淆了。
以下是我用来测试Arduino语法的一些代码。我知道* message)buff会给我一个指针(我仍然不知道为什么我需要使用指针,但我可以对它进行一些研究!),我将* message_buff转换为String(只是为了做某事) ,但请注意,稍后当我尝试将此字符串打印到序列时,我只获得一个'c'字符)。
我设置一个数组指针3个元素长(3个字节长???我真的不知道):
char *mqtt_command[3] = {};
以及稍后当我尝试使用以下命令向数组添加值时:
*mqtt_command[i] = str;
我收到错误:
error: invalid conversion from 'char*' to 'char'
如果我改为:
mqtt_command[i] = str;
(没有*)它编译得很好。我不知道为什么......
这是我的代码:
char *message_buff = "command:range:1";
char *str;
String msgString = String(*message_buff);
char *mqtt_command[3] = {};
int i = 0;
void setup()
{
Serial.begin(9600);
delay(500);
while ((str = strtok_r(message_buff, ":", &message_buff)) != NULL)
{
Serial.println(str);
mqtt_command[i] = str;
i++;
}
delay(1000);
Serial.print("Command: ");
Serial.println(mqtt_command[1]);
Serial.print("MQTT string: ");
Serial.println(msgString);
}
void loop()
{
//do something here later
}
这是输出:
command
range
1
Command: range
MQTT string: c
有人可以帮我理解字符,字符串,指针,字符数组吗?我可以在哪里找到关于该主题的全面教程?
我正在做的是通过MQTT传入一个命令字符串(我认为它是一个字符串,也许它是一个char数组????),消息是:
command:range:1
我正在尝试构建一个小协议,以便在收到MQTT消息时在Ardiuno上执行操作。我可以很好地处理MQTT回调,这不是问题,问题是我不太了解C字符串和字符。我希望能够处理如下命令:
command:range:0
command:digital:8
read:sensor:2
等
非常感谢任何帮助。
答案 0 :(得分:7)
首先需要一个C(和/或C ++)入门,你需要更多地了解声明和指针访问的语法等等。
此:
char *mqtt_command[3] = {};
表示“mqtt_command
是一个3 char *
”的数组,即三个指向字符的指针。由于字符串表示为字符的指针,因此可以将其称为“三个字符串的数组”。虽然字符本身没有实际的空间,所以这还不够,但这是一个好的开始。
然后,您的第一个错误就是这段代码:
*mqtt_command[i] = str;
编译器抱怨的问题是你要解除引用次数太多次了。只需mqtt_command[i]
就足够了,它可以计算出数组的第i个值,它的类型为char *
。然后,您的初始星号取消引用该指针,意味着左侧表达式的类型现在为char
,即它是单个字符。你不能将指针分配给一个角色,它(通常)不适合。
删除初始星号以解决此问题。
进一步分析,这:
char *message_buff = "command:range:1";
String msgString = String(*message_buff);
出于同样的原因,也是错误的。你取消引用message_buff
指针,所以String()
构造函数的参数只是第一个字符,即c
。再次,删除最初的星号,你的意思是:
String msgString = String(message_buf);
可以写成:
String msgString(message_buf);
答案 1 :(得分:0)
mqtt_command[i] = str;
这将起作用,因为mqtt_command[i]
已经是char指针。 *
会将其重定向到任何以前分配的内存,这在代码中不会完成。