我正在尝试完成一项家庭作业,其中一部分是设计一个将字符串插入另一个字符串的函数。除了strlen()之外的所有函数对我来说都是不受限制的。具体问题是:我无法实现在插入字符串的目标字符串中“腾出空间”的函数部分。插入字符串总是会导致数组元素的践踏。谁能指出我在这里做错了什么?谢谢你帮我学习!
编辑:整数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');
}
答案 0 :(得分:2)
优雅的解决方案使用倒车来达到理想的效果。假设您的目标字符串str由两个块AB组成,其中A是插入点之前的块,B是插入点之后的块。此外,假设要插入的字符串ins由第三个块C表示。
可以看出,如果将C连接到AB然后反转B,反向C,并反转B和C,则得到ACB,这是所需的结果。更明确地说,这是将C附加到AB之后的内容:
ABC
这就是你想要的:
ACB
ACB可以通过以下方式获得:
以下是实现此算法的代码:
void reverse(char *, char *, char *);
/* Insert string C between blocks AB in str */
void insertstring(char *str, char *ins, int n) {
/* 1 - Append C to the end of str */
int i = strlen(str);
char *p = str+i, *q = ins;
while ((*p++ = *q++));
p--;
/* 2 - Reverse C and B */
reverse(str, str+i, p-1); /* C */
reverse(str, str+n, str+i-1); /* B */
/* 3 - Reverse B_rC_r */
reverse(str, str+n, p-1);
}
void reverse(char *str, char *begin, char *end) {
char tmp;
while (begin < end) {
tmp = *begin;
*begin = *end;
*end = tmp;
begin++;
end--;
}
}
以及一些示例代码来测试它:
#include <stdio.h>
#include <string.h>
int main() {
void insertstring(char *, char *, int);
char test[128] = "A string to test.";
printf("Before: %s\n", test);
insertstring(test, "hello!", 4);
printf("After: %s\n", test);
return 0;
}
这将插入“你好!”从测试开始[4]。这是输出:
$ ./test
Before: A string to test.
After: A sthello!ring to test.
考虑采用这种方法:代码简短而优雅。这项技术在Programming Pearls,第2版中描述,作为执行矢量旋转的好方法。根据作者的说法,Brian Kernighan和P.J. Plauger在Pascal的软件工具中使用了这种方法来在文本编辑器中移动行。
答案 1 :(得分:1)
首先你有改变
for (i=strlen(str); i > n; --i)
到
for (i=strlen(str); i >= n; --i)
因为您还必须移动str[n]
。
另一个问题是当您插入ins
:
do {
*p = *ins;
++p;
++ins;
}
while (*ins != '\0');
您可以在此处将终结'\0'
从ins
复制到str
,以便其他内容丢失。将其更改为
while (*ins != '\0') {
*p = *ins;
++p;
++ins;
}
答案 2 :(得分:0)
在提到n
之后,将循环更新为
for (i=n+scoot; i >= n; i--)
您希望从strlen(ins)
位置前移n
个字符。
答案 3 :(得分:0)
用单循环试验,
转到索引,将
src
内容复制到temp_array
,同时将medi
复制到src
完全复制medi
后,开始将temp_array
的内容置于空白
void insert_in_middle (char *src, char *medi, int index)
{
int i=0, j = index, k=0;
char temp_array[50];
while(src[j] != '\0' || temp_array[k] != '\0')
{
temp_array[i] = src[j];
if(medi[i] != '\0')
{
src[j] = medi[i];
}
else if(temp_array[k] != '\0')
{
src[j] = temp_array[k];
k++;
}
i++; j++;
}
printf("src[%s]\n", src);
printf("medi[%s]\n",medi);
printf("temp_array[%s]\n",temp_array);
}