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;
}