如何在标准C中创建一个新的char*

3

我有一个用于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" */

我遇到了一个小问题,我正在Ubuntu上制作标准的C程序,需要这段代码。但是,“new”并没有被识别为保留字,并且下面甚至还有一个红色标记。

我尝试了:char *StrResult[strlen(Str) + 2],但它不起作用,因为这种方式只接受常量值。我猜“malloc”可能是标准的C解决方案,在这种情况下我该如何使用“malloc”或任何其他方法?非常感谢。


2
你把C和C++混淆了,提示:你正在使用malloc作为标记。 - Yu Hao
你已经给出了答案:malloc。网络上有大量关于如何使用它的信息。 - Pankrates
一个与你的问题无关的建议:请只调用一次strlen(),将结果赋值给一个变量,并从那时起使用该变量而不是额外的strlen()调用。 - Michael Burr
只需将new char[X]替换为malloc(X),并在顶部加入#include <stdlib.h> - M.M
问题已经解决,谢谢所有回复的人。 - soulblazer
3个回答

5

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)


非常感谢大家提供的帮助性答案。 我们学习的是C++,但这位新教授却要求我们使用C和Ubuntu进行编程。他所做的唯一贡献就是让整个班级混淆了C和C++之间的区别。再次感谢大家。 - soulblazer
@Graeme Perrow,您能否解释一下为什么要使用malloc(len + 2)?我的意思是为什么是+2?为什么不能是+1? - inckka
在 C 语言中,所有字符串必须以空字符 ('\0') 结尾。当为字符串分配内存时,必须为字符串中的字符分配足够的字节,再加上一个用于空字符的字节。在这种情况下,您需要为字符串中已有的字符(len)再加上 1 个额外字符所需的字节数进行分配,然后再加上 1 个空字符所需的字节。 - Graeme Perrow

1

是的,你需要使用malloc,并且你在混淆C和C++(因为new来自于C++):

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

char 只占用一个字节(参见这个问题),因此您不需要乘以其大小:

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

3
不要在C语言中强制转换malloc函数的返回值。 - user539810

0

一种方法:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接