Как создать новый символ * в стандарте C
У меня есть этот код для C++ (он работает):
char* ConcatCharToCharArray(char *Str, char Chr)
{
char *StrResult = new char[strlen(Str) + 2];
strcpy(StrResult, Str);
StrResult[strlen(Str)] = Chr;
StrResult[strlen(Str) + 1] = '\0';
return StrResult;
}
/* Example: String = "Hello worl"
Char = "d"
Final string = "Hello world" */
Маленькая проблема в том, что я делаю стандартную программу на C в Ubuntu, и мне нужен этот код. И "новое" НЕ распознается как зарезервированное слово, и под ним даже есть красная метка.
Я старался: char *StrResult[strlen(Str) + 2]
, но это не работает, потому что этот способ допускает только постоянные значения. Я предполагаю, что "malloc" будет стандартным решением C здесь, как я мог бы сделать это с "malloc" или любым другим способом в этом отношении? Огромное спасибо.
3 ответа
new
это способ выделения памяти в C++ В C ты прав, нужно использовать malloc
,
char* ConcatCharToCharArray(char *Str, char Chr)
{
size_t len = strlen( Str );
char *StrResult = malloc( len + 2 );
/* Check for StrResult==NULL here */
strcpy(StrResult, Str);
StrResult[len] = Chr;
StrResult[len+1] = '\0';
return StrResult;
}
Когда вы закончите с памятью, вы позвоните free( StrResult )
,
Да, вам нужен malloc, и вы путаете C с C++ здесь (так как new
происходит из C++):
char *StrResult = (*char) malloc((strlen(Str) + 2) * sizeof(char));
char занимает только один байт (см. этот вопрос), поэтому вам не нужно умножать его размер:
char *StrResult = (*char) malloc(strlen(Str) + 2);
В одну сторону:
char* ConcatCharToCharArray(char *Str, char Chr)
{
size_t StrLen = strlen(Str);
char *StrResult = malloc(StrLen + 2);
if(NULL == StrResult)
goto CLEANUP;
strcpy(StrResult, Str);
StrResult[StrLen++] = Chr;
StrResult[StrLen] = '\0';
CLEANUP:
return StrResult;
}
Тем не менее, вышеизложенное выделяет новую строку вместо конкатенации символа к существующей строке. Вот способ расширить существующую строку дополнительным символом:
int StrConcatChar(char **string, char character)
{
int rCode=0;
size_t stringLen;
char *temp;
if(NULL == string)
{
rCode=EINVAL;
goto CLEANUP;
}
stringLen = *string ? strlen(*string) : 0;
errno=0;
temp=realloc(*string, stringLen+2);
if(NULL == temp)
{
rCode=errno?errno:ENOMEM;
goto CLEANUP;
}
*string=temp;
(*string)[stringLen++] = character;
(*string)[stringLen] = '\0';
CLEANUP:
return(rCode);
}
Вышеприведенная функция может быть вызвана так:
{
int rCode=0;
char *buffer=NULL;
buffer=strdup("Hello worl");
if(NULL == buffer)
/* handle error condition */
rCode=StrConcatChar(&buffer, 'd');
if(rCode)
/* handle error condition */
...
if(buffer)
free(buffer);
}