我试图解析从 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);
提前致谢
最佳答案
您在示例中说明的问题可能是由于空指针引起的;或者由于非空终止字符数组而遇到奇怪的行为。
在您的小示例中,您构建了一个可能不以 null 结尾的 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 将不会以 null 结尾!事实上,您可以改用 strlcpy
(它在我的 arduino linux v1.6.9 编译器中可用)。
您还应该检查 strstr
是否返回 NULL 指针。或者更好:使用 indexOf
,并检查它是否不返回 -1。
关于c++ - Arduino:尝试将 Char[] 转换为字符串时为空字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41926178/