如何将const char*转换为string然后再转换回char*?

13

我刚开始学习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;
}

4
如果您只需要只读访问,您可以使用c_str()函数(例如,a.c_str()),它会返回一个const char* - James Adkison
当我将const char转换为string时,我需要能够修改该字符串,但是当我想将string转换为char时,只是为了返回输出。@JamesAdkison - Arya Atighehchian
4
不要进行这些转换操作:在整个程序中都使用std::string - Cheers and hth. - Alf
4
使用std::string::c_str时要注意:当std::string超出其作用域时,返回的指针将无效。因此,您不能使用它来返回本地字符串的缓冲区。 - Baum mit Augen
std::string a("jyillit"); 其中 &a[0] 是具有写入访问权限的 char* - Алексей Неудачин
4个回答

20

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

5

首先,你不需要那么多代码来构造一个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*,因为这是一个作业。我该如何释放返回值的内存? - Arya Atighehchian
1
你需要查找有关 strdup 的文档,以了解它们用于分配内存的函数。如果它们使用 malloc,则必须对返回的内存使用 free。如果它们使用 operator new,则必须对返回的值使用 delete [] - R Sahu

1
不要使用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++;

(实际上,现在不再使用标签,您可以完全删除它。)

让我再重复一遍:不要使用char*,而是使用std::string


0

将您的函数声明更改为

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是为了容纳一个终止零字节。


我需要保持方法不变,因为这是一个任务要求。我只是想将输入转换为字符串,修改字符串并添加连字符以显示音节,然后再将其转换回char*以便返回。 - Arya Atighehchian
@AryaAtighehchian:我认为我已经通过编辑解决了您的问题,这是在发布的“编辑窗口”到期之前发生的(因此不会列为编辑)。 - Cheers and hth. - Alf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接