从字符串中删除空字符的Arduino代码

-1 embedded arduino nodemcu arduino-c++

我正在使用nodemcu ESP8266并编写一个程序将一些值存储到EEPROM(分配缓冲区地址115到150来存储用户名)。

当我使用 for 循环从 115 到 150 读取 EEPROM 数据时,它将返回未知字符和字符串。当我检查空值以确定字符串何时结束时,代码不起作用。

带有奇怪字符的输出图像

我的代码:

//My Code for store username
String consumername = obj [String("USERNAME")] ;
         Serial.println("writing eeprom > Consumer Name:");
          for (int i = 0; i < consumername.length(); ++i) 
              {
             EEPROM.write(115 + i, consumername[i]);
           Serial.print("Wrote: ");
              Serial.println(consumername[i]);
          }
Run Code Online (Sandbox Code Playgroud)
//My Code for reading username
for (int i = 115; i < 150; ++i) 
 {
     ch = char(EEPROM.read(i));
     if(ch!='\0'){
     oname+= char(EEPROM.read(i));
 }
 }
     Serial .print("Name=");
     Serial .println(oname);
Run Code Online (Sandbox Code Playgroud)

Ric*_*ers 5

在我看来,您在写入 EEPROM 时没有包含字符串终止符。将 更改i < consumername.length()i <= consumername.length()包含字符串终止符。

for (int i = 0; i <= consumername.length(); ++i) 
{
         EEPROM.write(115 + i, consumername[i]);
       Serial.print("Wrote: ");
          Serial.println(consumername[i]);
}
Run Code Online (Sandbox Code Playgroud)

正如下面的评论所指出的,您的读取循环需要修改。下面我假设oname您要向其中添加字符的空字符串。因此,您需要从 EEPROM 中读取字符,直到读取到字符串末尾为止,此时您已完成读取。

for (int i = 115; i < 150; ++i) 
{
    ch = char(EEPROM.read(i));
    if(ch == '\0') break; // if end of string found, break out of read loop.
    oname += ch;
}
Run Code Online (Sandbox Code Playgroud)

  • 供参考:https://github.com/arduino/ArduinoCore-API/blob/master/api/String.h#L225(字符串的长度不包括尾随的“\0”)。今天的教训是,我从来没有为arduino编程过。但花精力去阅读头文件(或文档)的内容总是值得的 (2认同)