从2个子串创建一个字符串

时间:2016-04-17 07:07:01

标签: c string

我想从这个方式从字符串'scr'复制的2个子字符串中创建一个大字符串'des':

我想复制子字符串,让我们调用它 - 'string1'(从ptr x到'scr'字符串的末尾),然后将它放在'des'中,然后将它与另一个子串连接起来,让我们称之为''字符串2'从'scr'字符串复制到字符串的头部到x ptr。我怎么能不使用临时字符串

例如:scr =“ThisIs”,string1 =“Is”,string2 =“This”des =“IsThis”

我不想使用临时字符串来保存字符串1或字符串2.

你能帮帮我吗?

2 个答案:

答案 0 :(得分:1)

您不需要临时字符串,只需要一个指针来保存子字符串的边界。请尝试以下方法:

char src[] = "ThisIs";
char dst[7] = {'\0'};
int len = strlen(src);
int str1len = 4;
strncpy(dst, src + str1len, len - str1len);
strncpy(dst + len - str1len, src, str1len);
printf("src=%s, dst=%s\n", src, dst);

答案 1 :(得分:1)

如果你知道第二个字符串的位置,你可以按相反的顺序将两个子字符串打印到目标字符串:

char *src = "ThisIs";       // source string
char dst[7];                // char buffer for destination string

int pos = 4;                // position of second substring

snprintf(dst, sizeof(dst), "%s%.*s", src + pos, pos, src);
puts(dst);

说明:

  • snprintf将格式化数据写入字符串,就像printf将格式化数据写入屏幕一样。它将缓冲区长度作为第二个参数,并使用它来确保缓冲区不会溢出。它还保证结果字符串为空终止。
  • 如果输出的字符串数多于缓冲区可容纳的字符数,则输出将被截断。如果缓冲区非常大,snprintf将返回字符串所具有的长度。您可以使用该返回值来检查输出是否被截断。
  • 第二个子字符串以空值终止,因为它在整个字符串src结束的地方结束。您可以使用printf("%s", str + pos)进行打印,其中pos是子字符串的开头。
  • 第一个子字符串不是以null结尾。您可以在一段时间后%s提供printf("%.4s", str)格式的“精确度”,从而打印任意长度的子字符串。
  • 您可以通过在格式中使用星号来制作该精度变量,然后在实际参数之前提供额外的int参数:printf("%.*s", 4, str)

这个答案的核心答案与fluter相同,但它可以防止缓冲区溢出,并且涉及更少的长度计算。