web-dev-qa-db-ja.com

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 != '\0'){
        a += input[i];
        input++;
        i++;
    }

    //convert a string to char*

    return NULL;
}
8

A:std::stringクラスには、char const*を受け取るコンストラクターがあるため、変換を行うインスタンスを作成するだけです。

B:std::stringのインスタンスには、char const*に戻すために使用できるchar const*を返すc_str()メンバー関数があります。

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

まず、入力から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){
2
R Sahu

char*は使用しないでください。 std::stringを使用してください。他のすべての記事と同じです。これにより、このような問題がすべて解消されます。

ただし、完全を期すため、および背景を理解したいので、何が起こっているのかを分析しましょう。


while(input != '\0'){

あなたはおそらく意味します:

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

コードはinputポインター自体を\0と比較します。つまり、\0charからの不幸な自動変換が原因でnullポインターをチェックします。たとえば、'x'または'a'と比較しようとすると、ランタイムクラッシュではなくコンパイルエラーが発生します。

dereferenceポインタが*inputを介してcharを指すようにしたい。

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

これも機能しません。 inputポインターをインクリメントしますが、[i]を使用すると、さらにさらに進みます。たとえば、inputが3回インクリメントされた場合、input[3]は、4番目の配列ではなく、関数に渡された元の配列の7番目の文字になります。配列の境界を離れると、最終的には未定義の動作になります。未定義の動作は"バスエラー10"になることもあります。

と置換する:

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

(実際、iは使用されなくなったので、完全に削除できます。)


繰り返しますが、char*は使用しないでください。 std::stringを使用します。

1
Christian Hackl

関数宣言を

_char* getHyphen(const char* input)
_

_auto hyphenated( string const& input )
    -> string
_

_char const*_への変換およびその逆変換のすべての問題を回避します。

つまり、次のように_std::string_から_char_const*_を構築できます。

_string( "Blah" )
_

_char const*_メソッドを使用して、一時的な_c_str_を取得します。

_c_str_の結果は、元のstringインスタンスが存在し、変更されていない限り有効であることに注意してください。たとえば、_c_str_をローカルstringに適用してその結果を返すと、未定義の動作が発生するため、お勧めできません。絶対に_char*_または_char const*_を返す必要がある場合は、newを使用して配列を割り当て、strcpyを使用して文字列データをコピーします。次のようにします:return strcpy( new char[s.length()+1], s.c_str() )、ここで、_+1_は、終了ゼロバイトを収容します。