我想从这个方式从字符串'scr'复制的2个子字符串中创建一个大字符串'des':
我想复制子字符串,让我们调用它 - 'string1'(从ptr x到'scr'字符串的末尾),然后将它放在'des'中,然后将它与另一个子串连接起来,让我们称之为''字符串2'从'scr'字符串复制到字符串的头部到x ptr。我怎么能不使用临时字符串?
例如:scr =“ThisIs”,string1 =“Is”,string2 =“This”des =“IsThis”
我不想使用临时字符串来保存字符串1或字符串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
是子字符串的开头。%s
提供printf("%.4s", str)
格式的“精确度”,从而打印任意长度的子字符串。int
参数:printf("%.*s", 4, str)
这个答案的核心答案与fluter相同,但它可以防止缓冲区溢出,并且涉及更少的长度计算。