字符串到char *函数

时间:2018-05-18 14:59:24

标签: c++ pointers arduino c-strings

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

4 个答案:

答案 0 :(得分:4)

此功能:

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());

答案 1 :(得分:3)

正如Mark Ransom在评论中所指出的,当您按值传递字符串时,字符串command是原始字符串的本地副本。因此,您无法返回指向其c_str()的指针,因为该指针指向本地副本,当函数完成时,该副本将超出范围。因此,您会遇到与此处所述相同的错误:How to access a local variable from a different function using pointers?

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

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

现在,字符串通过引用传递,以便c_str()引用与调用者(string1)中的字符串对象相同的字符串对象。我还采用了libery来同时修复const-correctness。

请注意,您无法通过c_str()返回的指针修改字符串!因此,保持此const非常重要。

答案 2 :(得分:2)

这里的问题是你已经通过值将String command传递给函数,这会复制你传递给函数的String。因此,当您调用const_cast<char*>(command.c_str());时,您正在指向复制String的c字符串。由于您演员的String在函数范围内,因此当函数返回且指针基本无效时,将释放内存。你想要做的是将参数更改为String & command,它将传递对字符串的引用,当函数返回时,它的内存不会被释放。

答案 3 :(得分:2)

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

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();