【问题标题】:How to create a new char* in standard C如何在标准 C 中创建一个新的 char*
【发布时间】:2014-08-06 21:37:27
【问题描述】:

我为 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 程序,我需要这段代码。 并且“新”不被识别为保留字,甚至还有一个红色标记。

我试过:char *StrResult[strlen(Str) + 2],但它不起作用,因为这种方式只接受常量值。我猜“malloc”将是这里的标准 C 解决方案,我怎么能用“malloc”或任何其他方式来做到这一点?太感谢了。

【问题讨论】:

  • 您将 C 与 C++ 混淆了,提示:您使用 malloc 作为标签。
  • 你已经给了自己答案:malloc。 interwebz 上有大量关于如何使用它的信息
  • 一个与您的问题无关的建议:请只调用一次strlen(),将结果分配给一个变量并使用该变量,而不是从那时起额外调用strlen()
  • 只需将new char[X] 替换为malloc(X),并在顶部替换#include <stdlib.h>
  • 问题已经解决,谢谢大家的回复。

标签: c memory malloc arrays strlen


【解决方案1】:

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++ 的内容之间。再次感谢大家。
  • @Graeme Perrow 你能解释一下为什么malloc(len + 2) 吗?我的意思是为什么+2?为什么它不能 +1?
  • C 中的所有字符串都必须以空字节结尾 ('\0')。为字符串分配内存时,您必须为字符串中的字符分配足够的字节,并为空字节分配 1 个字节。在这种情况下,您需要为字符串 (len) 中已有的字符分配足够的字节,为要添加到字符串中的额外字符分配 1,然后为空字节分配另一个 +1。
【解决方案2】:

是的,你需要 malloc 并且你在这里混淆了 C 和 C++(因为 new 来自 C++):

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

char 只占用一个字节(见this question),所以你不需要乘以它的大小:

char *StrResult = (*char) malloc(strlen(Str) + 2);
【解决方案3】:

一种方式:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-12
    • 2015-12-31
    • 1970-01-01
    • 2012-10-08
    • 1970-01-01
    相关资源
    最近更新 更多