C++ - как добавить символ к символу*?

Я пробовал так, возможно, способы в интернете, чтобы добавить символ к символу*, но ни один из них не работает. Вот одно из моих неполных решений:

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] = '';
    return ret;
}

это работает только тогда, когда переданный массив "" (пустой внутри). В противном случае это не помогает (и получил ошибку в (1)). Не могли бы вы пожалуйста помочь мне с этим ? Большое спасибо в advanced !

4 ответов


удалить char * ret объявления внутри if блоки, которые скрывают внешний ret. Поэтому у вас есть утечка памяти, а с другой стороны, не выделенная память для ret.

для сравнения строки в стиле c вы должны использовать strcmp(array,"") не 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] = '';

    return ret;
}

обратите внимание, что вы должны обрабатывать выделенную память возвращаемых ret где-то delete[] его.

почему вы не используете 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] = '';
    }       

    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] = '';

    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