题目:
实现在字符串的内部增加字符串。 void insert(char * s1,char * s2, int n); 将s2指向的字符串的拷贝,添加到s1第n个字符的位置,原位置的字符后移。n=0时,s2增加到s1的首部; n=s1的字符串长度时,s2增加到s1的末尾。 注意:使用空格字符来表示字符串的结束。 例如source指向位置,依次保存了字符'a',字符'b',字符空格' ',字符'c',则source指向的字符串为"ab"。 保存为functions.cpp。 遇到异常情况,输出"error";否则不要随意输出,会视为错误。
分析:由于本题是用空格标识数组的结束,我们就不能用,<string.h>中的strlen来计算数组的字符数,我们要自己写一个执行这个功能的函数。
以下代码是先将字符后移在增加的字符:
#include<stdio.h>
#include<string.h>
int length(char* s)
{
int i=0;
while(s[i]!=' ')
{
i++;
}
return i;
}
void insert(char * s1,char * s2, int n)
{
if(s1==NULL||s2==NULL)
{
printf("error");
return ;
}
int i;
int L1=length(s1);
int L2=length(s2);
if(n<0||n>L1)
{
printf("error");
return ;
}
else if(n==L1)
{
for(i=0;i<L2;i++)
{
s1[L1+i]=s2[i];
}
}
else if(n==0)
{
for( i=L1-1;i>-1;i--)
{
s1[i+L2]=s1[i];
}
for( i=0;i<L2;i++)
{
s1[i]=s2[i];
}
}
else
{
for( i=L1-1;i>n-1;i--)
{
s1[i+L2]=s1[i];
}
for( i=0;i<L2;i++)
{
s1[i+n]=s2[i];
}
}
s1[L1+L2]=' ';
}
如果我们观察仔细。我们发现后移和增加这两部其实是及其类似的,我们可以将他们也写为两个函数。
#include<stdio.h>
#include<string.h>
int length(char* s);
void place(char* s1,int L1,int L2,int n);
void copy(char *s1, char *s2,int L1,int L2,int n);
void insert(char * s1,char * s2, int n)
{
if(s1==NULL||s2==NULL)
{
printf("error");
return ;
}
int L1=length(s1);
int L2=length(s2);
if(n<0||n>L1)
{
printf("error");
return ;
}
place( s1,L1,L2, n);
copy(s1,s2,L1,L2, n);
s1[L1+L2]=' ';
}
int length(char* s)
{
int i=0;
while(s[i]!=' ')
{
i++;
}
return i;
}
void place(char* s1,int L1,int L2,int n)
{
if(n==L1)
{
return;
}
for(int i=L1-1;i>n-1;i--)
{
s1[i+L2]=s1[i];
}
}
void copy(char *s1, char *s2,int L1,int L2,int n)
{
for(int i=0;i<L2;i++)
{
s1[i+n]=s2[i];
}
}