web-dev-qa-db-ja.com

C ++-char *にcharを追加する方法

インターネットで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)でエラーが発生しました)。これで私を助けてくれませんか?高度に感謝します!

11
sonlexqt

外側の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;
13
deepmax

関数名は、関数の意味を反映していません。実際には、文字を追加しません。元の配列と指定された文字を含む新しい文字配列を作成します。したがって、文字配列に文字を追加する関数が本当に必要な場合は、次のように記述します

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 );
} 
2

具体的な問題は、既存の変数に割り当てるのではなく、新しい変数を宣言していることです。

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;
}
1
Mike Seymour
char ch = 't';
char chArray[2];
sprintf(chArray, "%c", ch);
char chOutput[10]="tes";
strcat(chOutput, chArray);
cout<<chOutput;

出力:

test
0
Safa Seed