Как создать новый символ * в стандарте 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);
}
Другие вопросы по тегам