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" 以避免错误和误解。