【问题标题】:concat string to beginning of another string [closed]将字符串连接到另一个字符串的开头[关闭]
【发布时间】:2016-05-07 06:42:33
【问题描述】:

是否有一个函数可以让我将一个字符串连接到另一个字符串的开头?

例如,如果我有

str1 = "world!";
str2 = "Hello, ";

有没有办法将这些字符串组合成一个包含“Hello, world!”的字符串?

【问题讨论】:

  • 你看过strcat吗?

标签: c string concatenation


【解决方案1】:

您可以使用静态声明的内存来执行此操作,而不是动态分配内存,并避免额外调用malloc 和调用free。无论哪种方式都很好。一个简单的例子是:

#include <stdio.h>
#include <string.h>

enum { MAXL = 64 }; /* constant for max concatenated length */

int main (void) {

    char str1[MAXL] = "hello";
    char str2[MAXL] = "world";
    char dest[2*MAXL+1] = "";

    strcpy (dest, str1);
    strcat (dest, " ");
    strcat (dest, str2);
    strcat (dest, "!");

    printf ("\n%s\n\n", dest);

    return 0;
}

使用示例

$ ./bin/concat

hello world!

无论哪种方式,关键是确保您的destination 字符串中有足够的空间来保存连接的结果。以最大字符数组合 2 个字符串意味着只有 1 个分隔符,您可以使用现有字符串可用存储空间的两倍(您只需在组合字符串而不是之前的 2)。如果您添加其他字符作为分隔符,您只需将这些字符也添加到可用的总存储空间中。如果您有任何问题,请告诉我。

【讨论】:

  • 为什么不#define MAXL 64
  • 这也很好用。但是我从一个包含enum { MAXC = 32, MAXL = 64 }; 的文件中提取了一个文件,所以我只删除了一个并保留了另一个(懒惰:)
【解决方案2】:

它可以通过多种方式完成。这是一种使用动态内存分配的方法:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void)
{ 
    char* str1 = "world!";
    char* str2 = "Hello, ";
    char* p = malloc(strlen(str1) + strlen(str2) + 1);  // Allocate memory for the new string
    strcpy(p, str2);  // Copy str2 to the new string
    strcat(p, str1);  // Concatenate str1
    printf("%s", p);  // print it
    free(p);          // free the allocated memory
    return 0;
}

在此处尝试代码:http://ideone.com/oydJHN

你可以使用类似的东西来代替动态内存分配:

#define LENGTH_OF_RESULT 100

char result[LENGTH_OF_RESULT];

而不是char* p;。您必须确保 LENGTH_OF_RESULT 足够大以容纳连接的字符串。

动态内存分配的好处是您无需担心目标字符串的大小 - 只需根据输入字符串的长度分配您需要的内容,并为空终止添加 1。

使用动态内存分配的缺点是你必须记住在使用它时free 内存。

【讨论】:

  • 你忘了stdlib.h
【解决方案3】:

您可以制作自己的函数。这很容易:

#include <stdio.h>
#include <string.h>

void my_strcat(char *dst, const char *src);


int main(void)
{
    char dst[50] = "world";
    char src[] = "hello ";
    my_strcat(dst, src);
    printf("%s\n", dst);
    return 0;
}

void my_strcat(char *dst, const char *src)
{
    size_t dst_len = strlen(dst) + 1, src_len = strlen(src);
    memmove(dst + src_len, dst, dst_len);
    memcpy(dst, src, src_len);
}

【讨论】:

  • 您的代码不会以 NUL 终止,对吧?所以,UB...
  • 现在可以了。我认为 NUL 终止,但像 char dst[50] = "string" 这样的声明会留下大量的 0
  • 啊,是的。我错过了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2012-12-16
相关资源
最近更新 更多