Arduino:尝试将Char []强制转换为String时为空字符串

时间:2017-01-29 21:29:48

标签: c++ string casting arduino char

我试图解析从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);

提前致谢

3 个答案:

答案 0 :(得分:2)

您在示例中说明的问题可能是由于空指针;或者你遇到奇怪的行为,因为非空终止的char数组。

在您的小示例中,您构造了一个可能不是以null结尾的char数组。我尝试了但是我的编译器(arduino)倾向于偶然纠正它。实际上它看到str2就像一个常量,所以它把它放在程序存储器中,而RAM内存中没有任何东西。因此它将数组用0进行初始化。但是它看到40个单元格没有被使用,但是第一个被简单地复制到一个String,因此它永远不会创建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。

答案 1 :(得分:1)

通过打印确保 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

答案 2 :(得分:0)

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