簡體   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