【问题标题】:Safe way to concat two strings in C在C中连接两个字符串的安全方法
【发布时间】:2016-07-26 01:10:59
【问题描述】:

我有以下代码连接两个字符串:

char *getConcatString(char *str1, char *str2) {
    char *finalString = malloc(1 + strlen(str1) + strlen(str2)); // Needs to be freed by the user after use
    if(finalString == NULL)
        return NULL;

    strcpy(finalString, str1);
    strcat(finalString, str2);

    return finalString;
}

有没有更安全的方法来做到这一点?就像前任一样。 strncat 和 strncpy? 谢谢

【问题讨论】:

  • 我认为strncatstrncpy 是不必要的,因为您已经为这两个字符串保留了足够的空间。不过,您可能需要检查 str1str2 是否不为空,特别是如果您不能保证它永远不会为空。否则,我觉得很好。
  • @Idos 由于我们是根据 str1 和 str2 的大小为最终字符串分配内存,所以在 memcpy 中消除了缓冲区溢出,对吗?
  • @ryyker 我已经在函数外释放了 finalString 并且它没有引起任何问题
  • @ryyker 对不起,你完全错了。 malloc'ing 然后返回这样的指针是非常好的。
  • @user3266083 一般来说,这是一种很好的方法,而且您的代码看起来也不错。

标签: c string concatenation strcpy strcat


【解决方案1】:

有没有更安全的方法来做到这一点?

我对函数唯一要做的就是更改它的参数声明并检查参数的 NULL。

例如

char * getConcatString( const char *str1, const char *str2 ) 
{
    char *finalString = NULL;
    size_t n = 0;

    if ( str1 ) n += strlen( str1 );
    if ( str2 ) n += strlen( str2 );

    if ( ( str1 || str2 ) && ( finalString = malloc( n + 1 ) ) != NULL )
    {
        *finalString = '\0';

        if ( str1 ) strcpy( finalString, str1 );
        if ( str2 ) strcat( finalString, str2 );
    }

    return finalString;
}

【讨论】:

  • 这是一个很好的实现;我喜欢它安静地——但稳健地——将空指针视为空字符串的方式。
  • 因为你已经初始化了指针:*finalString = '\0';,那么后面的两个语句都可以使用strcat()吗? (而不是第一个中的strcpy()。)
  • @ryyker 是的,您可以在这两种情况下使用 strcat。这些调用在这种情况下是等效的。
猜你喜欢
  • 1970-01-01
  • 2019-11-08
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-17
  • 1970-01-01
相关资源
最近更新 更多