【问题标题】:Arduino: Empty String when trying to cast a Char[] to StringArduino:尝试将 Char [] 转换为 String 时为空字符串
【发布时间】:2017-01-29 21:29:47
【问题描述】:

我试图解析从 Web 服务获得的一些信息。问题是我无法将 char[] 转换为 String。我没有收到任何错误,但字符串为空。阅读互联网上的很多页面,包括Convert char array to String,但它对我不起作用。

String dataStr = esp8266.readString(); // get the information

const char *dataChar = (const char *)dataStr.c_str();
char * pch;
pch = strstr (dataChar,"nonce"); //finds the first occurrence of nonce
char nonceChar[40];
strncpy (nonceChar, pch, sizeof(nonceChar)); //copy just the part i need
String result (nonceChar); 
Serial.println(result);//it prints nothing
Serial.println(result.length()); //it prints 0

我也尝试了一个简单的例子,但我得到了相同的空字符串:

char str2[40]
str2[0]='a';
str2[1]='b';
String v (str2);

提前致谢

【问题讨论】:

  • 尝试空终止字符数组

标签: c++ string casting arduino char


【解决方案1】:

您在示例中说明的问题可能是由于空指针引起的;或者您会因为非空终止字符数组而遇到奇怪的行为。

在您的小示例中,您构造了一个可能不是以空值结尾的 char 数组。我试过了,但我的编译器(arduino)往往会意外纠正它。事实上,它看到 str2 就像一个常数,所以它把它放在程序内存中,而不是在 RAM 内存中。因此它用 0 初始化数组。然而它看到 40 个单元没有被使用,但是第一个 3 被简单地复制到一个字符串,因此它永远不会创建char str2[40]。你的小代码:

char str2[40]
str2[0]='a';
str2[1]='b';
String v (str2);
Serial.println(v);

通常被编译器转换(/优化)为:

String v ("ab");  // note that "ab" is null-terminated
Serial.println(v);

或:

Serial.println("ab");

请注意,转换是一个示例;编译器将根据所写的内容进行其他假设。

我不确切知道您在其他地方的程序中正在做什么,但我认为您可以使用arduino String class 完成所有操作。例如,您的主要示例应该是这样的:

  String dataStr("deb,nonce,end");
  int ind = dataStr.indexOf("nonce");
  String result = dataStr.substring(ind);
  Serial.println(result);

我很确定你不应该使用旧的 c 字符串库;它们使用起来很复杂,而且非常危险。例如strncpy 几乎是无用的,它给你的只是strcpy。在strncpy(nonceChar, pch, sizeof(nonceChar)); 中,如果 pch 太长,nonceChar 将不会被空终止!事实上你可以使用strlcpy 代替(它在我的arduino linux v1.6.9 编译器中可用)。

您还应该检查strstr 不返回NULL 指针。或者更好:使用indexOf,并检查它是否不返回-1。

【讨论】:

  • 感谢您的帮助,您的示例有效,但我注意到问题来自我存储在字符串“dataStr”中的 http 请求,出于任何原因它不适用于我得到的字符串来自 esp8266 缓冲区并导致奇怪的行为。
【解决方案2】:

通过打印确保 pch 有效。你不需要将你的 dataStr 分配给其他变量。最后,等号运算符的String类重载函数。您可以使用示例:

String dataStr = esp8266.readString(); // get the information

char * pch = strstr (dataStr.c_str(), "nonce"); 
char nonceChar[40];
memset(nonceChar, 0, 40);
strncpy (nonceChar, pch, 39);
String result =  nonceChar;

Serial.println(result);//it prints nothing
Serial.println(result.length()); //it prints 0

【讨论】:

    【解决方案3】:

    问题来自 dataStr 的内容,奇怪的行为是由于 esp8266 缓冲区上的任何异常。我将 String dataStr = esp8266.readString() 替换为 String dataStr = esp8266.readStringUntil(Word),这是字符串变量 Word 出现在缓冲区中的一个已知单词在我需要的字符串之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-08
      • 1970-01-01
      • 2021-11-14
      • 1970-01-01
      • 1970-01-01
      • 2014-09-20
      • 2011-07-25
      • 1970-01-01
      相关资源
      最近更新 更多