【问题标题】:Concatenation of 2 strings and a new pointer returned连接 2 个字符串并返回一个新指针
【发布时间】:2011-07-10 23:15:58
【问题描述】:

我不确定我是不是在做梦,因为我在任何地方都找不到这个功能。该函数调用 2 个字符串进行连接,然后将指针返回到一个新分配的内存块,其中 2 个字符串融合在一起。

有人知道这样的功能吗?

【问题讨论】:

    标签: c string function pointers


    【解决方案1】:

    我不知道 C 标准中有类似的东西; POSIX C 包含 strdup ,它返回所提供字符串的新分配副本,但这不是您要问的。

    不过,您可以轻松地自己构建它:

    char * strcat_alloc(const char * first, const char * second)
    {
        size_t s1=strlen(first), s2=strlen(second), stot=s1+s2+1;
        // Length overflow check (see @R.. comment)
        if(stot<s2+1)
            return NULL;
        char * ret = malloc(stot);
        if(ret==NULL)
            return NULL;
        strcpy(ret,first);
        strcpy(ret+s1, second);
        return ret;
    }
    

    【讨论】:

    • strdup 的扭曲记忆可能只是我的问题。
    • 如果firstsecond 指向重叠的内存,s1+s2+1 可能会溢出。当然,在size_t 小于void * 的虚假拱门上。检查可能是明智的。 :)
    • @R..:这是一个非常不可能的情况(你必须有一个大于一半地址空间的字符串),但理论上这是可能的,而且这是一个几乎没有成本的检查,所以我添加了它;注意s2+1 不能溢出,因为second 中数组的实际大小是s2+1(因为末尾有\0),并且C 中的每个对象大小都保证可以由size_t 表示.
    【解决方案2】:

    你能想到GLibg_strconcat() 函数吗?它完全不是一回事:它需要一个以NULL 结尾的字符串列表,而不仅仅是两个字符串。

    libc 中没有将字符串连接成新分配的字符串的标准函数。

    【讨论】:

    • 是的,这似乎越来越像一场梦了。
    • 我不保证没有这样的功能;例如,GNU libc 和 FreeBSD libc 都包含各种非标准函数,尽管我不记得它们都具有您所要求的确切功能。另一方面,它很容易实现为#define strdupcat(a, b) g_strconcat(a, b, NULL)
    【解决方案3】:

    检查这个问题:Using strcat in C

    另外,glib 提供了很多处理字符串的函数,如果你能承受额外的依赖的话。

    【讨论】:

      【解决方案4】:

      我不知道有现成的,但是这个经过轻微测试的实现怎么样:

      char* strdup_cat( char const* s1, char const* s2)
      {
          size_t siz1 = strlen(s1);
          size_t siz2 = strlen(s2);
      
          char* result = (char*) malloc(siz1 + siz2 + 1);
      
          if (result) {
              memcpy( result, s1, siz1);
              memcpy( result + siz1, s2, siz2 + 1);
          }
      
          return result;
      }
      

      【讨论】:

      • 如果你保存了strlen(s1)的返回值,你可以避免strcat中隐含的strlen
      • @Matteo:好的。 FWIW 现在在复制数据时甚至没有隐式检查字符串的结尾。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多