我为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] = ' ';
return StrResult;
}
/* Example: String = "Hello worl"
Char = "d"
Final string = "Hello world" */
问题是我在Ubuntu中编写一个标准的C程序,我需要这段代码。"new"不被认为是保留词,甚至在它下面有一个红色的标记。
我试过:char *StrResult[strlen(Str) + 2]
,但它不起作用,因为这种方式只允许常数值。我猜"malloc"将是这里的标准C解决方案,我怎么能用"malloc"或任何其他方式做到这一点呢?非常感谢。
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] = ' ';
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] = ' ';
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] = ' ';
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);
}