私は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;
}
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
まず、入力から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
からの不幸な自動変換が原因で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
を使用します。
関数宣言を
_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
_は、終了ゼロバイトを収容します。