首页 > 解决方案 > 我的字符串有隐藏字符并且比我肉眼看到的要长?

问题描述

问题

我有一个函数,可以将读取蓝牙连接的数据分配给 char 数组QualArray[4][30],尽管每个 char 数组的长度似乎比数组中视觉上出现的字符数大 1 个字符,暗示隐藏字符?

此外,我将这些字符串添加到另一个名为 'resource' usingstrcpy()的字符串中,字符串资源的长度比应有的长度多 5 个字符(因此 QualArray 中的 4 个附加隐藏字符是有意义的,但显然添加了另一个隐藏字符??) 我在字符串的开头和结尾打印了一个“_”,看看两边是否有空字符,但没有。

不知何故,我的字符串中有隐藏的字符,但我不知道为什么,任何帮助将不胜感激!

代码

char resource[160] = "/macros/s/AKfycbzTAkuhTqJfi-EofdpOjBxKNlDe18fdTkOPHMOuOwvl9zbDqfPHwbb1/exec?"; //must be pre-defined buffer
char staticresource[160] = "/macros/s/AKfycbzTAkuhTqJfi-EofdpOjBxKNlDe18fdTkOPHMOuOwvl9zbDqfPHwbb1/exec?Cooker=RiceCooker&Meal=Rice&Portion=3&Method=Boil";
char QualArray[5][30];     // [Qparam][charnum]
    
char CookerQuery[20] = "&Cooker=";
char MealQuery[15] = "&Meal=";
char PortionQuery[15] = "&Portion=";
char MethodQuery[15] = "&Method=";
    
void CollectQualitativeData() {
  int Qparam=0;
  int charnum = 0;

  while(Qparam < 4) { // While Qualitative data has not been collectedQualDataCollected = 0
    
    if (SerialBT.available()) {
      char incomingChar = SerialBT.read();
    
      if (QualArray[Qparam] !="" && incomingChar == '\n') { // If the message isnt empty and the recieved char is nothing (ie if at end of word) if (message !=""
        Serial.print(QualArray[Qparam]);
        Serial.print("_");
        Serial.print("  length = ");
        Serial.println(strlen(QualArray[Qparam]));
          
        Qparam++;
        charnum = 0;
      }
        
      if (incomingChar != '\n'){ // If the incomingChar is different than \n, concatenate that char character to QualArray.
        if (charnum <30) { // if greater than maximum specified array val then ignore
          QualArray[Qparam][charnum] = incomingChar;
          charnum++;
        } 
      } else {
      }
    }
    delay(20);
  }
}
    
void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test"); //Bluetooth device name
  //Serial.println("The device started, now you can pair it with bluetooth!");
    
  CollectQualitativeData();
  Serial.println("Complete");
  Serial.println(QualArray[0]);
  Serial.println(QualArray[1]);
  Serial.println(QualArray[2]);
  Serial.println(QualArray[3]);
  Serial.println(QualArray[4]);
    
  strcat(resource,CookerQuery); // resource + Resource_variables
  strcat(resource,QualArray[0]); 
  strcat(resource,MealQuery); // resource + Resource_variables
  strcat(resource,QualArray[1]); 
  strcat(resource,PortionQuery); // resource + Resource_variables
  strcat(resource,QualArray[2]); 
  strcat(resource,MethodQuery); // resource + Resource_variables
  strcat(resource,QualArray[3]); 
   
  Serial.print("resource=_");
  Serial.print(resource);
  Serial.println("_");  
  Serial.print("staticresource=_");
  Serial.print(staticresource);
  Serial.println("_");
  Serial.print("length static=");
  Serial.println(strlen(staticresource));
  Serial.print("length resource=");
  Serial.println(strlen(resource));
}

https://github.com/Conwon99/4th-Year-Project/blob/main/StringLengthIssue

串口监视器调试

    RiceCooker_长度= 11
    Rice_length = 5
    3_ 长度 = 2
    煮沸长度 = 5
    完全的
    电饭锅
    
    米
    
    3
    
    熬
    
资源=_/macros/s/AKfycbzTAkuhTqJfi-EofdpOjBxKNlDe18fdTkOPHMOuOwvl9zbDqfPHwbb1/exec&Cooker=RiceCooker&Meal=Ric&Portion=3&Method=Boil_
    staticresource=_/macros/s/AKfycbzTAkuhTqJfi-EofdpOjBxKNlDe18fdTkOPHMOuOwvl9zbDqfPHwbb1/exec?Cooker=RiceCooker&Meal=Rice&Portion=3&Method=Boil_
    长度静态=125
    长度资源=130

标签: cstringarduinoesp32

解决方案


char[]具有空终止符值\0,它被计为数组的长度。只需使用std::vectorString。无论如何,您的代码是不可编译的。我给你改写:

#include <BluetoothSerial.h>
#include <vector>

const char resource[] PROGMEM = "/macros/s/AKfycbzTAkuhTqJfi-EofdpOjBxKNlDe18fdTkOPHMOuOwvl9zbDqfPHwbb1/exec?"; //must be pre-defined buffer
const char staticresource[] PROGMEM = "/macros/s/AKfycbzTAkuhTqJfi-EofdpOjBxKNlDe18fdTkOPHMOuOwvl9zbDqfPHwbb1/exec?Cooker=RiceCooker&Meal=Rice&Portion=3&Method=Boil";

const char cookerQuery[] PROGMEM = "&Cooker=";
const char mealQuery[] PROGMEM = "&Meal=";
const char portionQuery[] PROGMEM = "&Portion=";
const char methodQuery[] PROGMEM = "&Method=";

std::vector<String> qualArray;
BluetoothSerial SerialBT;

void CollectQualitativeData() {
  while (qualArray.size() < 4 ) {
    if (SerialBT.available()) {
      String incomingChar = SerialBT.readStringUntil('\n');
      qualArray.push_back(incomingChar);
    }
    delay(20);
  }
}

void setup() {
  Serial.begin(115200);
  SerialBT.begin("ESP32test");

  CollectQualitativeData();
  Serial.println("Complete");

  for (int i = 0; i < qualArray.size(); i++) {
    Serial.println(qualArray[i]);
  }

  String res(resource);
  res += cookerQuery + qualArray[0];
  res += mealQuery + qualArray[1];
  res += portionQuery + qualArray[2];
  res += methodQuery + qualArray[3];
  Serial.println(res);
}

void loop() {}

推荐阅读