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; }
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; }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。