insert #35

题目:

实现在字符串的内部增加字符串。
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];
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值