繁体   English   中英

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

[英]How can I convert const char* to string and then back to 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 != '\0'){
        a += input[i];
        input++;
        i++;
    }

    //convert a string to char*

    return NULL;
}

答: 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 != '\\0'){ 

你可能意味着:

while(*input != '\0') {

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

您希望通过*input 取消引用指针以获取指向的char

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

这也行不通。 你递增input指针,但是[i]进一步前进。 例如,如果input增加了三次,则input[3]将是传递给函数的原始数组的第7个字符,而不是第4个字符。 当您离开数组的边界时,这最终会导致未定义的行为。 未定义的行为也可能是您提到的“总线错误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*

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

C/C++ 方便的数据类型交换函数。 在这个 repo 中有所有 c++ 数据类型的便利函数,我把它们都写在 python 中。

使用这个回购:

https://github.com/azizovrafael/Simple-CPlusPlus

例子:

...

int main(){
   int n = INT(INPUT("Write Some Text For Console Ex. (Enter: )"));
   string str = STR(n);
 
   return 0;
}

...

#simplecplusplus

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM