我试图解析从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);
提前致谢
答案 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出现在缓冲区中的已知单词在我需要的字符串之后。