首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C:从char创建数组*

C:从char创建数组*
EN

Stack Overflow用户
提问于 2020-01-18 09:50:32
回答 1查看 61关注 0票数 0

我正在使用arduino接收来自RF69芯片的射频信息。

该消息包含天气数据,如温度、湿度和气压。

接收到的字符串如下所示: 1:22.26:41.53:1023.73 (msg类型:temp:hum:pres)

我需要将其转换为数组,然后将数据复制到浮点值中。

使用strtok,我可以复制一些数据,但我似乎缺少一些值。

代码语言:javascript
复制
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]);
}

这似乎是正确的输出:

代码语言:javascript
复制
Message: 1:22.32:41.18:1023.77
22.32
41.18
1023.77

然后,当我分配浮点数时,我忽略了t值:

代码语言:javascript
复制
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);

输出:

代码语言:javascript
复制
Temperature =  0.00
Rel. Humidity =  41.33
Pressure =  1023.78

有人能解释一下为什么我遗漏了温度值吗?

另外,由于我对C没有经验,是否有更好的方法来做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-18 10:19:27

此代码:

代码语言:javascript
复制
while( array[i] != NULL){ 
    array[++i] = strtok(NULL,separator);
    Serial.println(array[i]);
}

写入超出界限的array[3]array[4]。压力字段被写入array[0],然后NULL被写入array[4]

改为:

代码语言:javascript
复制
while( i < sizeof(array) / sizeof(*array) &&
       array[i] != NULL) 
{
    array[i] = strtok(NULL,separator);
    Serial.println(array[i]);
    i++ ;
}

它覆盖在array[0]上的指针,该指针具有您要丢弃的消息类型,并迭代直到提取所有字段,而不是当strtok()返回NULL时。

然后更改atof()中的索引

代码语言:javascript
复制
float t = atof(array[0]);
float h = atof(array[1]);
float p = atof(array[2]);

您还可以验证消息类型是否正确。

代码语言:javascript
复制
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个元素,循环主体将变成:

代码语言:javascript
复制
        i++ ;
        array[i] = strtok(NULL,separator);
        Serial.println(array[i]);

您可以按照原始代码预先增加array[++i],但我不建议使用它--它不能提供清晰性,而且在更复杂的表达式中使用时语义和顺序变得复杂--总是使用它“独立”以避免错误和误解。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59799346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档