soulblazer
soulblazer

Reputation: 1219

How to create a new char* in standard C

I have this code made for C++ (it works):

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" */

The little problem is that I'm making a standard C program in Ubuntu and I need this code. And "new" is NOT being recognized as a reserved word and there's even a red mark under it.

I tried: char *StrResult[strlen(Str) + 2], but it doesn't work because that way only admits constant values. I'm guessing "malloc" would be the standard C solution in here, how could I do this with "malloc" or any other way for that matter? Thank you so much.

Upvotes: 3

Views: 22036

Answers (3)

Mahonri Moriancumer
Mahonri Moriancumer

Reputation: 6003

One way:

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

However, the above allocates a new string, instead of concatenating a character to an existing string. Here is a way to expand an existing string with an additional character:

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

The above function might be called like this:

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

Upvotes: 0

DiPi
DiPi

Reputation: 99

Yes, you need malloc and you are confusing C with C++ here (since new comes from C++):

char *StrResult = (*char) malloc((strlen(Str) + 2) * sizeof(char));

char takes only one byte (see this question), so you don't need to multiply by it's size:

char *StrResult = (*char) malloc(strlen(Str) + 2);

Upvotes: 1

Graeme Perrow
Graeme Perrow

Reputation: 57248

new is the C++ way of allocating memory. In C you're right, you need to use 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;
}

When you're done with the memory, you'd call free( StrResult ).

Upvotes: 5

Related Questions