簡體   English   中英

C: strtok() 定界符循環隨機失敗

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM