我正在尝试完成一项家庭作业,其中一部分是设计一个函数,用于将一个字符串插入另一个字符串,除了strlen()之外,所有函数都是我的禁区,具体来说,问题是这样的:我在实现函数中为插入的字符串在目标字符串中“腾出空间”的部分时遇到了麻烦。插入字符串总是会导致数组元素被践踏。有人能指出我在这里做错了什么吗?谢谢你帮助我学习!
Edit:Integer n是字符串中应该插入另一个字符串的位置。
void insertstring(char *str, char *ins, int n)
{
int i;
int scoot=strlen(ins);
char *p=str+n;
for (i=strlen(str); i > n; --i) { //This is where I'm doing it wrong I think
str[i+scoot]=str[i]; //
}
do {
*p = *ins;
++p;
++ins;
}
while (*ins != '\0');
}
5条答案
按热度按时间ffx8fchx1#
一个优雅的解决方案是使用反转来获得所需的结果。假设您的目标字符串str由两个块AB组成,其中A是插入点之前的块,B是插入点之后的块。此外,假设要插入的字符串ins由第三个块C表示。
可以看出,如果将C连接到AB上,然后将B反转,将C反转,将B和C都反转,则得到ACB,这是所需的结果,更明确地说,这是将C附加到AB后得到的结果:
美国广播公司
这就是你想要的
ACB
ACB可通过以下方式获得:
下面是实现此算法的代码:
以及一些示例代码来测试它:
这将在测试[4]的开头插入“hello!”,输出如下:
考虑采用以下方法:代码简短而优雅。这种技术在Programming Pearls,2nd edition中被描述为执行矢量旋转的好方法。根据作者的说法,Brian Kernighan和P. J. Plauger在他们的Pascal软件工具中精确地使用了这种方法来在文本编辑器中移动行。
p4rjhz4m2#
首先你有零钱
到
因为你也要移动
str[n]
。另一个问题是在插入
ins
时:在这里,您将终止的
'\0'
从ins
复制到str
,以便丢失其余部分。yrdbyhpb3#
在提到
n
之后,将for循环更新为您要将
strlen(ins)
从位置n
向前移动字符数。flvlnr444#
尝试单循环,
转到索引,将
src
内容复制到temp_array
,同时将medi
复制到src
一旦medi
复制完成,就开始放入temp_array
的内容,直到其变为空z9gpfhce5#