[英]C: strtok() delimeter loop randomly failing
我正在拆分一個字符串(帶有天氣信息):
1:7.34:7.54:87.62:1012.33
其中:消息類型、溫度、內部溫度、濕度和氣壓
if (rf69.available()) {
uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
if (rf69.recv(buf, &len)) {
if (!len) return;
buf[len] = 0;
Serial.print("Received [");
Serial.print(len);
Serial.print("]: ");
Serial.println((char*)buf);
Serial.print("RSSI: ");
Serial.println(rf69.lastRssi(), DEC);
char* data;
data = (char*)buf;
char separator[] = ":";
char *array[4]; //4
int i=0;
array[i] = strtok(data,separator);
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++ ;
}
}
char* t1 = array[0];
char* t2 = array[1];
char* h = array[2];
char* p = array[3];
Serial.print("Temperature Outside= "); Serial.print(t1);
Serial.print(" Temperature Enclosure= "); Serial.print(t2);
Serial.print(" Rel. Humidity = "); Serial.print(h);
Serial.print(" Pressure = "); Serial.println(p);
}
}
正確的結果是:
Received [25]: 1:7.33:7.51:87.53:1012.32
RSSI: -60
7.33
7.51
87.53
1012.32
Temperature Outside= 7.33 Temperature Enclosure= 7.51 Rel. Humidity = 87.53 Pressure = 1012.32
但在隨機時間我似乎得到了這個:
Received [25]: 1:7.33:7.50:87.60:1012.33
RSSI: -60
7.33
Temperature Outside= 7.33 Temperature Enclosure= Rel. Humidity = Pressure = ⸮
如您所見,原始日期看起來不錯,但它在隨機時間處理失敗。
我沒有看到任何明顯的東西,但我也不是 C 專家。
我將循環更改為:
char *array[4];
char separator[] = ":";
char *segmentPointer = strtok((char*)buf, separator);
int i = 0;
if ((segmentPointer[0] == '1') && (segmentPointer[1] == '\0')) {
segmentPointer = strtok(NULL, separator);
while (segmentPointer != NULL) {
array[i] = segmentPointer;
i++;
segmentPointer = strtok(NULL, separator);
}
}
該循環現在可以可靠地按預期工作!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.