c - 我的字符串有隐藏字符并且比我肉眼看到的要长?
问题描述
问题
我有一个函数,可以将读取蓝牙连接的数据分配给 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
解决方案
char[]
具有空终止符值\0
,它被计为数组的长度。只需使用std::vector
和String
。无论如何,您的代码是不可编译的。我给你改写:
#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() {}
推荐阅读
- debugging - 英特尔的 oneapi C 编译器不生成调试信息
- c++ - 动态创建类型别名
- python - subprocess.Popen() 的每个实例都有自己的外壳吗?
- javascript - React Material UI Slider禁用颜色不更新
- splunk - 使用 Azure 事件中心设置 Splunk 时出现“提供了无效的客户端密码”错误
- python-3.x - 我需要一个整数,但它是一个带逗号的字符串
- python - 属性未定义错误,即使它是在全局范围内定义的
- javascript - 如何自动调整 API 输入的范围?
- vb.net - 无法从 datagridview 保存数据
- rust - 在 Rust 中验证 Google 登录 ID 令牌