加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-14 02:40:23 所属栏目:大数据 来源:网络整理
导读: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 = *(s

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 ('' != pa[i])
		{
			pa[i] = pa[i] - '0';
		}	
		
		if ('' != 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 c[N+1])
{
	int i = 0;
	char cFlag = 0;
	char tmpa[N] = {0},tmpb[N] = {0},tmpc[N+1] = {0};
	int ialen = 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;
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读