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