字符串到字符* 函数



对c/c ++来说相当新。我对以下代码有疑问:

char* string2char(String command){
if (command.length() != 0) {
char *p = const_cast<char*>(command.c_str());
return p;
}
}
void setup() {}
void loop() {
String string1 = "Bob";
char *string1Char = string2char(string1);
String string2 = "Ross";
char *string2Char = string2char(string2);
Serial.println(string1Char);
Serial.println(string2Char);
}

这基本上是重复输出:

Ross
Ross

我知道我无法掌握指针在这里如何工作的概念 - 有人能够解释它吗?我将如何更改它以使其显示:

Bob
Ross

这个函数:

char* string2char(String command){
if (command.length() != 0) {
char *p = const_cast<char*>(command.c_str());
return p;
}
}

没有多大意义,它按值获取字符串并返回指向其内部缓冲区的指针,并带大小写的 constnes(不要这样做(。当您返回已被销毁的对象的值时,您会得到一些奇怪的行为,请通过 ref 传递它。我也很好奇为什么你需要做所有这些事情,你不能通过:

Serial.println(string1.c_str());
Serial.println(string2.c_str());

正如 Mark Ransom 在注释中指出的那样,当您按值传递字符串时,字符串command是原始字符串的本地副本。因此,你不能返回指向其c_str()的指针,因为该指针指向本地副本,当函数完成时,这将超出范围。所以你得到的和这里描述的一样的错误:如何使用指针从不同的函数访问局部变量?

一个可能的解决方案是像这样重写函数:

const char* string2char(const String& command){
return command.c_str();
}

现在字符串通过引用传递,以便c_str()引用与调用方 (string1( 中的字符串对象相同的字符串对象。我还同时采取了自由来修复常量正确性。

请注意,您不能通过c_str()返回的指针修改字符串!所以保持这个const非常重要。

这里的问题是你已经按值将String command传递给函数,这会复制你传递给函数的任何String。因此,当您调用const_cast<char*>(command.c_str());时,您正在创建一个指向该复制String的 c 字符串的指针。由于您强制转换的String在函数范围内,因此当函数返回并且指针基本上无效时,将释放内存。您要做的是将参数更改为String & command这将传递对字符串的引用,当函数返回时不会释放其内存。

你的问题围绕着你的论点。

char* string2char(String command){   
// create a new string that's a copy of the thing you pass in, and call it command
if (command.length() != 0) {
char *p = const_cast<char*>(command.c_str());  
// get the const char* that this string contains.  
// It's valid only while the string command does; and is invalidated on changing the string.
return p;   /// and destroy command - making p invalid
}
}

有两种方法可以解决此问题。 第一个也是最复杂的是通过引用传入命令。 因此const String& command然后使用它。

另一种更简单的方法是完全删除你的函数;让你char*const char*,只在字符串上调用c_str();即

String string1 = "Bob";
const char *string1Char = string1.c_str();

最新更新