如何将const char*转换为字符串,然后再转换回char* ?



我刚开始学习c++,很难理解const char*。我试图将该方法中的输入转换为string,然后更改字符串以添加我想要的连字符,并最终将该字符串转换回char*返回。到目前为止,当我尝试这个时,它给了我一个总线错误10。

char* getHyphen(const char* input){
    string vowels [12] = {"A","E","I","O","U","Y","a","e","i","o","u","y"};
    //convert char* to string
    string a;
    int i = 0;
    while(input != ''){
        a += input[i];
        input++;
        i++;
    }
    //convert a string to char*
    return NULL;
}

A: std::string类有一个接受char const*的构造函数,所以您只需创建一个实例来进行转换。

B: std::string的实例有一个c_str()成员函数,它返回一个char const*,你可以用它转换回char const*

auto my_cstr = "Hello";        // A
std::string s(my_cstr);        // A
// ... modify 's' ...
auto back_to_cstr = s.c_str(); // B

首先,您不需要所有的代码来从输入构造std::string。你可以使用:

string a(input);

要返回一个新的char*,您可以使用:

return strdup(a.c_str());  // strdup is a non-standard function but it
                           // can be easily implemented if necessary.

确保释放返回值。

最好只是返回一个std::string,这样你的函数的用户就不必担心内存分配/释放。

std::string getHyphen(const char* input){

不要使用char*。使用std::string,就像这里所有其他人告诉你的那样。这将消除所有这样的问题。

然而,为了完整起见,因为你想了解背景,让我们分析一下发生了什么。


while(input != ''){

你的意思可能是:

while(*input != '') {

你的代码比较input指针本身和,即它检查一个空指针,这是由于不幸的自动转换从 char。如果您尝试与'x''a'进行比较,那么您将得到一个编译错误,而不是运行时崩溃。

你想通过*input指针解引用,得到char所指向的

a += input[i];
input++;
i++;

这也不能工作。您增加了input指针,但是对于[i],您甚至将进一步移动。例如,如果input被加了三次,那么input[3]将是传递给函数的原始数组的第7个字符,而不是第4个字符。当您离开数组边界时,这最终会导致未定义的行为。未定义行为也可以是你提到的"bus error 10"

替换为:

a += *input;
input++;
i++;

(实际上,现在i不再使用,您可以将其全部删除。)


我再重复一遍:不要使用char*。使用std::string

更改函数声明
char* getHyphen(const char* input)

auto hyphenated( string const& input )
    -> string

和避免转换到char const*和返回的所有问题。

也就是说,您可以从char_const*构造std::string,如下所示:
string( "Blah" )

,然后使用c_str方法返回一个临时的char const*

请注意,c_str的结果只有在原始string实例存在且未被修改的情况下才有效。例如,将c_str应用于本地string并返回该结果,会产生未定义行为,这不是一个好主意。如果您绝对必须返回char*char const*,则使用new分配一个数组,并用strcpy复制字符串数据,如return strcpy( new char[s.length()+1], s.c_str() ),其中+1用于容纳终止零字节。

最新更新