该功能有什么问题。怎么没有打印出来的?
char * CombineStr(char * str1, char * str2)
{
char strOut[256];
sprintf(strOut, “%s%s”, str1, str2);
return strOut;
}
答案 0 :(得分:2)
你应该注意范围(你的变量的存储持续时间):要么将返回的变量声明为静态,要么使用malloc
动态地在堆上分配它,并且free
分配的内存指向到strOut
,一度不再需要了。您应该使用sprintf
第二个参数格式的简单引号。你应该注意溢出
之一:
char * CombineStr(char * str1, char * str2)
{
static char strOut[256]; //scope!
if((strlen(str1) + strlen(str2)) < 256)
sprintf(strOut, "%s%s", str1, str2); //plain quotes!
return strOut;
}
或:
char * CombineStr(char * str1, char * str2)
{
char strOut = malloc(strlen(str1) + strlen(str2) + 1);
if( strOut != NULL )
sprintf(strOut, "%s%s", str1, str2); //plain quotes!
return strOut;
}
答案 1 :(得分:1)
另一个常见的解决方案是让调用者提供输出缓冲区
char * CombineStr(const char * str1,
const char * str2,
char * strOut,
size_t outlen)
{
size_t len = snprintf(strOut, outlen, "%s%s", str1, str2);
if (len < outlen)
{
return strOut;
}
return NULL;
}
注意从sprintf
切换到snprintf
以防止缓冲区溢出,如果连接的字符串超过缓冲区的长度。这允许我们捕获溢出并返回无效结果,让调用者知道buffer
不可信任。
典型用法是
char buffer[256];
if (CombineStr("I's the b'y that builds the boat",
"And I's the b'y that sails her",
buffer,
sizeof(buffer)) != NULL)
{
// use buffer
}
需要注意的是snprintf
具有不稳定的支持,并且不能始终被信任为空终止,但您可以确定它没有溢出缓冲区。
答案 2 :(得分:0)
更改为static char strOut[256];
。这不是一个很好的解决方案,但会起作用。