【发布时间】:2016-05-07 06:42:33
【问题描述】:
是否有一个函数可以让我将一个字符串连接到另一个字符串的开头?
例如,如果我有
str1 = "world!";
str2 = "Hello, ";
有没有办法将这些字符串组合成一个包含“Hello, world!”的字符串?
【问题讨论】:
-
你看过
strcat吗?
标签: c string concatenation
是否有一个函数可以让我将一个字符串连接到另一个字符串的开头?
例如,如果我有
str1 = "world!";
str2 = "Hello, ";
有没有办法将这些字符串组合成一个包含“Hello, world!”的字符串?
【问题讨论】:
strcat吗?
标签: c string concatenation
您可以使用静态声明的内存来执行此操作,而不是动态分配内存,并避免额外调用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 }; 的文件中提取了一个文件,所以我只删除了一个并保留了另一个(懒惰:)
它可以通过多种方式完成。这是一种使用动态内存分配的方法:
#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
您可以制作自己的函数。这很容易:
#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);
}
【讨论】:
char dst[50] = "string" 这样的声明会留下大量的 0