当前位置:  开发笔记 > 编程语言 > 正文

连接3个字符串并返回指向新字符串C的指针

如何解决《连接3个字符串并返回指向新字符串C的指针》经验,为你挑选了2个好方法。



1> chqrlie..:

你不能这样做,你会返回一个指向一个函数返回后不再有效的本地数组的指针,此外,你不会检查缓冲区溢出.

这是一个分配内存的快速脏版本:

#include   
#include 

char *concatenate(const char *a, const char *b, const char *c) {
    return strcat(strcat(strcpy(malloc(strlen(a) + strlen(b) + strlen(c) +  1,
                                a), b), c);
}

这是一个使用memcpy和测试malloc失败的更精细的版本:

#include   
#include 

char *concatenate(const char *a, const char *b, const char *c) {
    size_t alen = strlen(a);
    size_t blen = strlen(b);
    size_t clen = strlen(c);
    char *res = malloc(alen + blen + clen + 1);
    if (res) {
        memcpy(res, a, alen);
        memcpy(res + alen, b, blen);
        memcpy(res + alen + blen, c, clen + 1);
    }
    return res;
}

它应该是更有效,因为它不执行额外的扫描strcpystrcat做的,但只有细心的标杆可以证明,如果它是在上面的简单版本,真正的改善.

如果需要将3个字符串连接到现有缓冲区,一个非常简单的解决方案是:

char dest[DEST_SIZE];

snprintf(dest, sizeof dest, "%s%s%s", a, b, d);



2> Jorgel..:

你的str是你的功能的本地.
你可以在你的连接字符串中添加第四个参数,或者你可以在函数内部进行malloc,只需确保在使用后释放它.

char *concatenate(char *a, char *b, char *c)
{
  int size = strlen(a) + strlen(b) + strlen(c) + 1;
  char *str = malloc(size);
  strcpy (str, a);
  strcat (str, b);
  strcat (str, c); 

  return str;
}

int main(void) {

    char *str = concatenate("bla", "ble", "bli");

    printf("%s", str);
    free(str);

    return 0;
}

推荐阅读
携手相约幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有