c++ - Arduino:尝试将 Char[] 转换为字符串时为空字符串

标签 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);

提前致谢

最佳答案

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

在您的小示例中,您构建了一个可能不以 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/

相关文章:

string - 按索引排列的 NSIS 子字符串

c - 释放 malloc 不会删除 char 数据

c - 将指针转换为 int64_t 时丢失了最重要的 32 位

c++ - 将 Eigen::ArrayXXd 转换为 Eigen::MatrixXd

c++ - 用 for_each 遍历 vector<vector<?>>

java - 从 const 方法调用 JNI 函数

c - 将字符数组解析为指针数组中的单词(C 编程)

c++ - 无法转换 Omnet++::Packet 太 Inet::Packet

c++ - std::forward_list 和 std::forward_list::push_back

c++ - 数据是不同继承类型的二叉树