C: 从 char* 创建数组
C: create array from char*
我正在使用 arduino 从 RF69 芯片接收 RF 消息。
该消息包含天气数据,例如温度、湿度和气压。
收到的字符串如下所示:1:22.26:41.53:1023.73 (msg type:temp:hum:pres)
我需要将其转换为数组,然后将数据复制为浮点值。
使用 strtok 我可以复制一些数据,但我似乎缺少值。
Serial.print("Message: ");
Serial.println((char*)buf); //Message: 1:22.32:41.39:1023.77
char* data;
data = (char*)buf; //incoming from radio buffer
char separator[] = ":"; //delimeter
char *array[3]; //expect 3 value
int i=0; //start loop at 0
array[i] = strtok(data,separator); //first token
while(array[i]!=NULL) {
array[++i] = strtok(NULL,separator);
Serial.println(array[i]);
}
这似乎输出正确:
Message: 1:22.32:41.18:1023.77
22.32
41.18
1023.77
当我分配浮点数时,我遗漏了 t 值:
float t = atof(array[1]);
float h = atof(array[2]);
float p = atof(array[3]);
Serial.print("Temperature = "); Serial.println(t);
Serial.print("Rel. Humidity = "); Serial.println(h);
Serial.print("Pressure = "); Serial.println(p);
输出:
Temperature = 0.00
Rel. Humidity = 41.33
Pressure = 1023.78
有人可以解释为什么我缺少温度值吗?
另外,由于我没有使用 C 的经验,是否有更好的方法来做到这一点?
此代码:
while( array[i] != NULL){
array[++i] = strtok(NULL,separator);
Serial.println(array[i]);
}
写入超出范围的array[3]
和array[4]
。 presure字段写入array[0]
,然后NULL写入array[4]
。
更改为:
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}
覆盖 array[0]
处的指针,该指针具有您要丢弃的消息类型并迭代直到提取所有字段,而不是 strtok()
return NULL 时。
然后更改atof()
中的索引:
float t = atof(array[0]);
float h = atof(array[1]);
float p = atof(array[2]);
您还可以验证邮件类型是否正确。
array[i] = strtok(data,separator); //first token
if( array[i][0] == '1' && array[i][1] == 0 )
{
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}
}
如果实际上你想保留消息类型,那么array
需要4个元素,循环体将变成:
i++ ;
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
您可以根据您的原始代码在 array[++i]
中预递增,但我不推荐它 - 它不利于清晰,并且在更复杂的表达式中使用时语义和顺序变得复杂 - 总是使用它 "stand-alone" 以避免错误和误解。
我正在使用 arduino 从 RF69 芯片接收 RF 消息。
该消息包含天气数据,例如温度、湿度和气压。
收到的字符串如下所示:1:22.26:41.53:1023.73 (msg type:temp:hum:pres)
我需要将其转换为数组,然后将数据复制为浮点值。
使用 strtok 我可以复制一些数据,但我似乎缺少值。
Serial.print("Message: ");
Serial.println((char*)buf); //Message: 1:22.32:41.39:1023.77
char* data;
data = (char*)buf; //incoming from radio buffer
char separator[] = ":"; //delimeter
char *array[3]; //expect 3 value
int i=0; //start loop at 0
array[i] = strtok(data,separator); //first token
while(array[i]!=NULL) {
array[++i] = strtok(NULL,separator);
Serial.println(array[i]);
}
这似乎输出正确:
Message: 1:22.32:41.18:1023.77
22.32
41.18
1023.77
当我分配浮点数时,我遗漏了 t 值:
float t = atof(array[1]);
float h = atof(array[2]);
float p = atof(array[3]);
Serial.print("Temperature = "); Serial.println(t);
Serial.print("Rel. Humidity = "); Serial.println(h);
Serial.print("Pressure = "); Serial.println(p);
输出:
Temperature = 0.00
Rel. Humidity = 41.33
Pressure = 1023.78
有人可以解释为什么我缺少温度值吗?
另外,由于我没有使用 C 的经验,是否有更好的方法来做到这一点?
此代码:
while( array[i] != NULL){
array[++i] = strtok(NULL,separator);
Serial.println(array[i]);
}
写入超出范围的array[3]
和array[4]
。 presure字段写入array[0]
,然后NULL写入array[4]
。
更改为:
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}
覆盖 array[0]
处的指针,该指针具有您要丢弃的消息类型并迭代直到提取所有字段,而不是 strtok()
return NULL 时。
然后更改atof()
中的索引:
float t = atof(array[0]);
float h = atof(array[1]);
float p = atof(array[2]);
您还可以验证邮件类型是否正确。
array[i] = strtok(data,separator); //first token
if( array[i][0] == '1' && array[i][1] == 0 )
{
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}
}
如果实际上你想保留消息类型,那么array
需要4个元素,循环体将变成:
i++ ;
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
您可以根据您的原始代码在 array[++i]
中预递增,但我不推荐它 - 它不利于清晰,并且在更复杂的表达式中使用时语义和顺序变得复杂 - 总是使用它 "stand-alone" 以避免错误和误解。