字符串问题

字符串问题:

1,字符串比较

2,字符串转数字,例如“123”->123,“123a4”->123,且开头可以是空格,正负号

3,数字转字符串,例如1234->“1234”

4,两个字符串合并,例如“abc”,“xyz”->“abcxyz”


针对以上四类问题,我们接下来一一解答。

针对问题一,字符串比较问题

注意:一个字符一个字符的进行比较;其次,只要在比较的一对中分出大小则返回这个结果,否则,就是相等。

//字符串比较,如果第一个大返回>0的数字,相等返回0,第一个小返回<0的数字
int Mystrcmp(const char *str1,const char *str2)
{
	assert(str1!=NULL && str2!=NULL);
	if(str1 == NULL || str2 == NULL)
	{
		return 0;
	}
	int tmp;
	while((tmp=*str1-*str2)==0 && *str1!='\0' && *str2!='\0')
	{
		str1++;
		str2++;
	}
	return tmp;
}

int main()
{
	printf("%d\n",Mystrcmp("abc","x"));
	printf("%d\n",Mystrcmp("abc","abc"));
	printf("%d\n",Mystrcmp("abc","abb"));

	return 0;
}


-23
0
1
请按任意键继续. . .

 针对问题二,字符串转数字

注意:遇到数字即结束(这与标准函数一致,也可不结束),字符串开头可以是空格,正负号。

int Myatoi(const char *str)
{
	assert(str!=NULL);
	if(str == NULL)
		return 0;
	int tmp = 0;
	int flag = 1;
	while(*str==' ')
	{
		str++;
	}
	if(*str == '-')
	{
		flag = -1;
		str++;
	}
	if(*str == '+')
	{
		flag = 1;
		str++;
	}
	while(isdigit(*str))
	{
		tmp = tmp*10+(*str-'0');
		str++;
	}
	return flag*tmp;
}
int main()
{
	printf("%d\n",Myatoi("123"));
	printf("%d\n",Myatoi("-123a4"));
	printf("%d\n",Myatoi(" +123"));

	return 0;
}


123
-123
123
请按任意键继续. . .

针对问题三,数字转字符串

void Myitoa(char *buf,int n)
{
	char str[10] = "";
	int i=0;
	int len=0;
	if(buf == NULL)
	{
		return;
	}
	while(n)
	{
		buf[i++] = (n%10)+'0';
		n = n/10;
	} 
	buf[i] = 0;
	while(1)
	{
		i--;
		if(str[len-i-1] == 0)
			break;
		buf[i] = str[len-i-1];
	}
}//有待运行

针对问题四,两个字符串合并

注意:找到一字符串的尾巴最重要,简单说就是找’\0‘,再将另一字符串覆盖其’\0‘即可,最后返回指针(此时的指针不能返回,因为此时的指针已经在该字符数组的尾部,若强制返回会出错,正确的方法就是在一开始就保存其指针开始的地址)。

char *Mystrcat(char *des,const char *src)
{
	assert(des != NULL && src != NULL);//断言
	if(des==NULL || src==NULL)
		return NULL; 

	char *p = des;//保存指针位置

	while(*des != '\0')//寻找指针尾巴

	{
		des++;
	}
	while(*des++ = *src++);

	return p;

}

总结:

字符串的四个问题,就是上面所写的,虽然有库函数可以被我们所调用,但是总不能连机理都不懂吧,其实所解决的问题不难,但就靠自己的双手去打造更完美的代码啦!

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值