インターネットでchar *に文字を追加する方法を試しましたが、どれも機能していないようです。これは私の不完全な解決策の1つです。
char* appendCharToCharArray(char * array, char a)
{
char* ret = "";
if (array!="")
{
char * ret = new char[strlen(array) + 1 + 1]; // + 1 char + 1 for null;
strcpy(ret,array);
}
else
{
ret = new char[2];
strcpy(ret,array);
}
ret[strlen(array)] = a; // (1)
ret[strlen(array)+1] = '\0';
return ret;
}
これは、渡された配列が ""(内部の空白)の場合にのみ機能します。それ以外の場合は役に立ちません((1)でエラーが発生しました)。これで私を助けてくれませんか?高度に感謝します!
外側のif
を隠すret
ブロック内のchar * ret
宣言を削除します。そのため、メモリリークが発生する一方、ret
の未割り当てメモリがあります。
Cスタイルの文字列を比較するには、array!=""
ではなくstrcmp(array,"")
を使用する必要があります。あなたの最終的なコードは、ルックスは下記好き必要があります。
char* appendCharToCharArray(char* array, char a)
{
size_t len = strlen(array);
char* ret = new char[len+2];
strcpy(ret, array);
ret[len] = a;
ret[len+1] = '\0';
return ret;
}
返されるret
の割り当てられたメモリは、delete[]
itによって処理する必要があることに注意してください。
なぜ std::string
を使用しないのですか?文字列の末尾に文字を追加する.append
メソッドがあります。
std::string str;
str.append('x');
// or
str += x;
関数名は、関数の意味を反映していません。実際には、文字を追加しません。元の配列と指定された文字を含む新しい文字配列を作成します。したがって、文字配列に文字を追加する関数が本当に必要な場合は、次のように記述します
bool AppendCharToCharArray( char *array, size_t n, char c )
{
size_t sz = std::strlen( array );
if ( sz + 1 < n )
{
array[sz] = c;
array[sz + 1] = '\0';
}
return ( sz + 1 < n );
}
元の配列のコピーと特定の文字を含む関数が必要な場合、次のようになります。
char * CharArrayPlusChar( const char *array, char c )
{
size_t sz = std::strlen( array );
char *s = new char[sz + 2];
std::strcpy( s, array );
s[sz] = c;
s[sz + 1] = '\0';
return ( s );
}
具体的な問題は、既存の変数に割り当てるのではなく、新しい変数を宣言していることです。
char * ret = new char[strlen(array) + 1 + 1];
^^^^^^ Remove this
ポインタを比較して文字列値を比較しようとしています:
if (array!="") // Wrong - compares pointer with address of string literal
if (array[0] == 0) // Better - checks for empty string
ただし、その比較を行う必要はまったくありません。最初のブランチは、文字列が空かどうかにかかわらず正しいことを行います。
より一般的な問題は、C++で厄介でエラーが発生しやすいCスタイルの文字列操作をいじっていることです。使用する std::string
そして、すべてのメモリ割り当てを管理します:
std::string appendCharToString(std::string const & s, char a) {
return s + a;
}
char ch = 't';
char chArray[2];
sprintf(chArray, "%c", ch);
char chOutput[10]="tes";
strcat(chOutput, chArray);
cout<<chOutput;
出力:
test