字符串反转+ 大数相加 + IP分类

C语言基础随着工作,慢慢遗忘的一干二净,简单实现,不考虑效率,留作备忘。

一、反转

 

char *str_reserve11(char *src)
{
	char tmp;
	char *start = src;
	char *end =  src;
	
	if (NULL == src)
		return src;
		
	while(*(end++));
	
	end = end - 2;
		
	while(start < end)
	{
	  tmp        = *(start);
	  *(start++) = *(end);
	  *(end--)   = tmp;
	}

	return src;
}

char *str_reserve22(char *src, int len)
{
	char tmp;
	char *start = src;
	char *end =  src;
	char *usrend = src + len -1;
	
	if ((NULL == src) || (2 > len))
		return src;
		
	while(*(end++));
	
	end = end - 2;
	
	if (usrend > end)
		return NULL;
		
	//也可以用 for 来实现,
	#if 0
	for(i = 0; i < len/2; i++)
	{
	  tmp        = *(start+i);
	  *(start+i) = *(end - i);
	  *(end- i)   = tmp;
	}
	#endif	
	
	while(start < end)
	{
	  tmp        = *(start);
	  *(start++) = *(usrend);
	  *(usrend--)   = tmp;
	}

	return src;
}



二、大数相加

       注意:1、反转, 2、判断是否进位,3、注意循环哪个先到界,4、反序输出

void dashu_add(char a[N], char b[N], char c[N+1])
{
	int i = 0;
	char cFlag = 0;
	int ialen = 0, iblen = 0, imax = 0;
	char *pa = NULL, *pb = NULL, *pc = NULL;
	
	ialen = strlen(a);
	iblen = strlen(b);
	imax = ((ialen > iblen) ? ialen : iblen);
	
	pa = str_reserve11(a);
	pb = str_reserve11(b);
	
	for (i = 0; i < imax; i++)
	{
		if ('\0' != pa[i])
		{
			pa[i] = pa[i] - '0';
		}	
		
		if ('\0' != pb[i])
		{
			pb[i] = pb[i] - '0';
		}	
		
		c[i] = pa[i] + pb[i] + cFlag;
		
		if (10 <= c[i])
		{
			c[i] = c[i] - 10;
			cFlag = 1;
		}
		else
		{
			cFlag = 0;
		}
		
		c[i] = c[i] + '0';	
	}
	 if (1 == cFlag)
            c[i] = 1;																		
	pc = str_reserve11(c);
	
	printf("c=>%s<\n", c);	
		
	return;
} 

p.s:另一种不调用反序函数的方法。

        

void dashu_add22(char a[N], char b[N], char c[N+1])
{
	int i = 0;
	char cFlag = 0;
	char tmpa[N] = {0}, tmpb[N] = {0}, tmpc[N+1] = {0};
	int ialen = 0, iblen = 0, iclen = 0, imax = 0;
	
	ialen = strlen(a);
	iblen = strlen(b);
	imax = ((ialen > iblen) ? ialen : iblen);
		
	for (i = 0; i < ialen; i++)
	{
		tmpa[i] = a[ialen - i - 1] - '0';	
	}
	
	for (i = 0; i < iblen; i++)
	{
		tmpb[i] = b[iblen - i - 1] - '0';	
	}
	
	for (i = 0; i < imax; i++)
	{
		tmpc[i] = tmpa[i] + tmpb[i] + cFlag;
		
		if (10 <= tmpc[i])
		{
			tmpc[i] = tmpc[i] - 10;
			cFlag = 1;
		}
		else
		{
			cFlag = 0;
		}
		
		tmpc[i] = tmpc[i] + '0';	
	}
	
	if (1 == cFlag)
		tmpc[i] = 1;
	
	iclen = strlen(tmpc);
	for (i = 0; i < iclen; i++)
	{
		c[i] = tmpc[iclen - i - 1];	
	}

	printf("c=>%s<\n", c);	
		
	return;
}

三、判断IP地址范围

       一、主要是检查,下边代码检查还是不够足够严格,但一般可用。

   

typedef enum 
{  IP_A = 0'
   IP_B,
   IP_C,
   IP_D, 
   IP_E, 
   IP_NO 
}w; 


//输入ip, 并判断类型
#define MAXLEN 15  
#define MINLEN 7  
w m(char *s)
{
	char cEndChar = 0;
	w eRet = IP_NO;
	int iLoop = 0, iIpLen = 0;
	int iDotCount = 0, iDotPosition = 0;
	unsigned char *pucIpSegment = NULL;
	int iPart1 = 0, iPart2 = 0,	iPart3 = 0, iPart4 = 0;
	
	iIpLen = strlen(s);
	if ( (MINLEN > iIpLen) || (MAXLEN < iIpLen) )
	{
		return IP_NO;
	}
	
	for(iLoop = 0; iLoop < iIpLen; iLoop++)
	{
		if ( (('0' > s[iLoop]) || ('9' < s[iLoop])) && ('.' != s[iLoop]) )
		{
			return IP_NO;
		}
		
		if ('.' == s[iLoop])
		{
			if ( (0 == iLoop) || ((iIpLen - 1) == iLoop) )
			    return IP_NO;
			  
			if ('.' == s[iLoop - 1])
			   return IP_NO; 
			        
			iDotCount++;
		}
	}
	
	if (3 != iDotCount)
	{
		return IP_NO;
	}
	
	sscanf(s, %d.%d.%d.%d.%c, &iPart1, &iPart2,	&iPart3, &iPart4,&cEndChar);

	if ( (0 >= iPart1) || (255 <= iPart1) || \
	     (0 > iPart2) || (255 <= iPart2) || \
	     (0 > iPart3) || (255 <= iPart3) || \
	     (0 >= iPart4) || (255 <= iPart4) )
	{
			return IP_NO;	
	}
	
		if ( (0 < iPart1) && (127 >= iPart1) )
		{
			eRet = IP_A;
			printf("A IP class!\n");
		} 
		else if ( (127 < iPart1) && (191 >= iPart1) )
		{
			eRet = IP_B;
			printf("B IP class!\n");
		}
		else if( (191 < iPart1) && (223 >= iPart1) )
		{
			eRet = IP_C;
			printf("C IP class!\n");
		}
		else if ( (223 < iPart1) && (239 >= iPart1) )
		{
			eRet = IP_D;
			printf("D IP class!\n");
		}
		else if ( (239 < iPart1) && (247 >= iPart1) )
		{
			eRet = IP_E;
			printf("E IP class!\n");
		}							
		else
		{
			eRet = IP_NO;
			printf("Wrong IP class!\n");
		}
	    		
	return eRet;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值