输入描述:
输入的第一行包括一个整数n(1<=n<=500),代表下面会出现的IP地址的个数。
接下来的n行每行有一个IP地址,IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。
输出描述:
可能有多组测试数据,对于每组数据,如果IP地址合法则输出"Yes!”,否则输出"No!”。
合法的IP地址为:
a、b、c、d都是0-255的整数。
输入例子:
2
255.255.255.255
512.12.2.3
输出例子:
Yes!
No!
/*这种写法感觉有很多错误喃……如果输入负数?*/
#include <stdio.h>
#include <string.h>
bool checkIP(char *s)
{
int numOfChar = strlen(s);
if(numOfChar>15) // IP v4 0.0.0.0 ~ 255.255.255.255
return false;
int i,dotAdd[3],dotCount = 0;
for (i = 0; i < numOfChar; i++) // 找出.所在的下标 可以考虑边判断边动指针i
{
if (s[i] == '.')
{
dotCount++;
if (dotCount > 3)
return false;
dotAdd[dotCount-1] = i; // 日常下标减一 常见错误
}
}
if (dotCount != 3)
return false;
int num, j;
for (i = 0; i < dotCount; i++) // 只判断了.前面的符不符合要求,最后一个数字也要判断
{
num = 0,j = 1; // 通过.的位置定位其前后的数字字符并转化为数字
int index = dotAdd[i]-1; // 定位字符串中的.对其前面的数进行转换和求和操作 index > 0 && s[index] != '.'
while (index >= 0 && s[index] != '.')
{
num = num + j*(s[index] - '0');
j *= 10;
index--;
}
if (num > 255)
return false;
}
int lastDot = dotAdd[2];
num = 0, j = 1;
while (s[numOfChar - 1] != '.')
{
numOfChar--;
num = num + j*(s[numOfChar] - '0');
j *= 10;
}
if (num > 255)
return false;
return true;
}
int main()
{
char input[20];
int n;
scanf("%d", &n);
while (n--)
{
scanf("%s", input);
bool a = checkIP(input);
(a == false) ? printf("No!\n") : printf("Yes!\n");
}
return 0;
}
/*另外一种做法*/
#include <stdio.h>
#include <string.h>
bool checkIP(char *s)
{
int index = strlen(s) - 1;
if (strlen(s) > 15) // 0.0.0.0 ~ 255.255.255.255
return false;
int i,dotCount = 0;
for (i = 0; i <= index; i++) // 判断是否存在非法输入
{
if (s[i] == '.')
{
dotCount++;
continue;
}
else if (s[i] >= '0' && s[i] <= '9')
continue;
else
return false;
}
if (dotCount != 3) // 合格的ip v4 地址有三个点
return false;
// 使指针首先指向字符串的最后一个字符,从后往前扫是为了方便计算
while (1)
{
int num = 0, j = 1;
while (s[index] != '.' && index >= 0)
{
num = num + (s[index] - '0') * j;
j *= 10;
index--;
}
index--;
if (num > 255)
return false;
if (index < 0)
break;
}
return true;
}
int main()
{
char input[20];
int n;
scanf("%d", &n);
while (n--)
{
scanf("%s", input);
bool a = checkIP(input);
(a == false) ? printf("No!\n") : printf("Yes!\n");
}
return 0;
}