如何在C中使用带有char指针的sprintf

时间:2016-07-30 20:03:29

标签: c pointers char printf

该功能有什么问题。怎么没有打印出来的?

char * CombineStr(char * str1, char * str2)
{
    char strOut[256];
    sprintf(strOut, “%s%s”, str1, str2);
    return strOut;
}

3 个答案:

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

如需进一步阅读,请查看以下SO帖子:12

答案 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];。这不是一个很好的解决方案,但会起作用。