1.问题:IP地址判断
描述
在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。合法的IP是这样的形式:
A.B.C.D
其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不会有前导零存在,如001这种情况。现在,请你来完成这个判断程序吧
输入
输入由多行组成,每行是一个字符串,输入由“End of file”结束。字符串长度最大为30,且不含空格和不可见字符。
输出
对于每一个输入,单独输出一行。如果该字符串是合法的IP,输出YES,否则,
输出NO
样例
输入 输出
202.115.32.24 YES
a.b.c.d NO
End of file
2.我自己写的一段代码
#include <stdio.h>
#include <string.h>
int main()
{
char c[35];
int i, d1, d2, d3, mid, zhi1, zhi2, zhi3, zhi4, oo,gd=0, m;
while (1)
{
for (i = 0; i <= 35; i++)
{
c[i] = -1;
} //初始化
i = 0; m = 0;
while (c[m] != '\n')
{
c[i] = getchar(); m = i; i++;
}
oo = m - 1;
if (strcmp(c, "End of file") == 0) break;
else
{
for (i = 0; i <= 35; i++) //字符转成数字
{
c[i] = c[i] - 48;
}
for (i = 0; i <= oo; i++)
{
if ((c[i] >= 10 || c[i] < 0) && c[i] != '.' - 48) gd++;
}
if (gd != 0 || (c[oo] < 0 || c[oo]>9))
{
mid = 0;
goto end;
}
//找到小数点。格式不符合规范就结束
for (d1 = 0; d1 <= 35; d1++)
{
if (c[d1] == '.' - 48) break;
}
for (d2 = d1 + 1; d2 <= 35; d2++)
{
if (c[d2] == '.' - 48) break;
}
for (d3 = d2 + 1; d3 <= 35; d3++)
{
if (c[d3] == '.' - 48) break;
}
if (d1 == 36 || d2 == 36 || d3 == 36 || d1 == 0 || d2 - d1 == 1 || d3 - d2 == 1 || d1 >= 4 || d2 - d1 - 1 >= 4 || d3 - d2 - 1 >= 4 || oo - d3 >= 4)
{
mid = 0;
goto end;
}
//下面判断输入的值是否符合规范
//第一段
if (d1 == 3)
{
if (c[0] == 0 || (c[0] == 0 && c[1] == 0)) { mid = 0; goto end; }
else zhi1 = c[0] * 100 + c[1] * 10 + c[2];
}
else if (d1 == 2)
{
if (c[0] == 0) { mid = 0; goto end; }
else
zhi1 = c[0] * 10 + c[1];
}
else if (d1 == 1)
{
zhi1 = c[0];
}
//第二段
if (d2 - d1 == 4)
{
if (c[d1 + 1] == 0 || (c[d1 + 2] == 0 && c[d1 + 1] == 0)) { mid = 0; goto end; }
else
zhi2 = c[d1 + 1] * 100 + c[d1 + 2] * 10 + c[d1 + 3];
}
else if (d2 - d1 == 3)
{
if (c[d1 + 1] == 0) { mid = 0; goto end; }
else
zhi2 = c[d1 + 1] * 10 + c[d1 + 2];
}
else if (d2 - d1 == 2)
{
zhi2 = c[d1 + 1];
}
//第三段
if (d3 - d2 == 4)
{
if (c[d2 + 1] == 0 || (c[d2 + 1] == 0 && c[d2 + 2] == 0)) { mid = 0; goto end; }
else
zhi3 = c[d2 + 1] * 100 + c[d2 + 2] * 10 + c[d2 + 3];
}
else if (d3 - d2 == 3)
{
if (c[d2 + 1] == 0) { mid = 0; goto end; }
else
zhi3 = c[d2 + 1] * 10 + c[d2 + 2];
}
else if (d3 - d2 == 2)
{
zhi3 = c[d2 + 1];
}
//第四段
if (oo - d3 == 3)
{
if (c[d3 + 1] == 0 || (c[d3 + 1] == 0 && c[d3 + 2] == 0)) { mid = 0; goto end; }
else
zhi4 = c[d3 + 1] * 100 + c[d3 + 2] * 10 + c[d3 + 3];
}
else if (oo - d3 == 2)
{
if (c[d3 + 1] == 0) { mid = 0; goto end; }
else
zhi4 = c[d3 + 1] * 10 + c[d3 + 2];
}
else if (oo - d3 == 1)
{
zhi4 = c[d3 + 1];
}
if (zhi1 >= 0 && zhi2 >= 0 && zhi3 >= 0 && zhi4 >= 0 && zhi1 <= 255 && zhi2 <= 255 && zhi3 <= 255 && zhi4 <= 255)
{
mid = 1;
}
else
{
mid = 0;
}
end:
if (mid == 0) printf("NO\n");
else printf("YES\n");
}
}
return 0;
}
我试过了各种能想到的情况都是符合题目要求的,但是oj只给我了10.5/30分,我不知道有什么情况没有考虑到,求大神指点^o^。
谢谢大家,解决问题了^o^,循环的过程里面有变量的值改变了,我忘了在循环开始的时候初始化。不过还是谢谢大家的想法,我学到了很多呢!