gpt4 book ai didi

C:从 char* 创建数组

转载 作者:行者123 更新时间:2023-11-30 16:07:02 25 4
gpt4 key购买 nike

我正在使用 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

当我分配 float 时,我缺少 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]。将压力字段写入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() 返回 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] ,但我不推荐这样做 - 它不清晰,并且在使用时语义和排序会变得复杂更复杂的表达式 - 始终“独立”使用它以避免错误和误解。

关于C:从 char* 创建数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59799346/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com