是否有一个函数允许我将字符串连接到另一个字符串的开头?
例如,如果我有
str1 = "world!";
str2 = "Hello, ";
有没有办法将这些字符串组合成一个包含“Hello,world!”的字符串?
答案 0 :(得分:2)
您可以使用静态声明的内存来执行此操作,而不是动态分配内存,并避免额外调用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个分隔符,您可以使用两倍于现有字符串的可用存储空间(只需使用1 nul-terminatedating 字符即可获得一个字符串组合的字符串而不是之前的2)。如果您将其他字符添加为分隔符,则只需将这些字符添加到可用的总存储空间中。如果您有疑问,请告诉我。
答案 1 :(得分:1)
可以通过多种方式完成。这是一种使用动态内存分配的方法:
#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足够大以容纳连接字符串。
动态内存分配的好处是您不必担心目标字符串的大小 - 只需根据输入字符串的长度分配您需要的内容,并为null终止添加1。
使用动态内存分配的缺点是,完成后必须记住free
内存。
答案 2 :(得分:1)
你可以自己动手。很容易:
#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);
}