-
题目描述:
-
输入一个ip地址串,判断是否合法。
-
输入:
-
输入的第一行包括一个整数n(1<=n<=500),代表下面会出现的IP地址的个数。
接下来的n行每行有一个IP地址,IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。
-
输出:
-
可能有多组测试数据,对于每组数据,如果IP地址合法则输出"Yes!”,否则输出"No!”。
-
样例输入:
-
2 255.255.255.255 512.12.2.3
-
样例输出:
-
Yes! No!
-
提示:
-
合法的IP地址为:
a、b、c、d都是0-255的整数。
本来还一直在用string,想分隔开,转换成数字来做。直到我看到 scanf("%d.%d.%d.%d"),眼泪掉下来。
代码如下:
C语言:
#include<stdio.h>
int main(void)
{
int num;
int a[4];
while(scanf("%d",&num) != EOF)
{
for(int i = 0; i < num; i++)
{
scanf("%d.%d.%d.%d",&a[0],&a[1],&a[2],&a[3]);
if(a[1]>255 || a[1]<0 || a[0]>255 || a[0]<0 || a[2]>255 || a[2]<0 || a[3]>255 ||a[3]<0)
printf("No!\n");
else
printf("Yes!\n");
}
}
return 0;
}
是不是很简单呢?我觉得测试数据如果稍微难一些,肯定过不了。所以我搜集了一下大牛的代码。
JAVA版本:
import java.util.Scanner;
/**
* 1203
*
* @author yzf
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
for (int i = 0; i < n; i++) {
String[] charStr = scanner.next().split("\\."); 注意在split里是“\\.”这一点在我的一篇博文中提到过
boolean flag = true;
for (int j = 0; j < 4; j++) {
int m=Integer.valueOf(charStr[j]);
if ( m< 0|| m > 255) {
flag = false;
break;
}
}
if (flag) {
System.out.println("Yes!");
}else {
System.out.println("No!");
}
}
scanner.close();
}
}
有一点小发现,就是可以输入一行后直接打印,不必等待全部输入完成后在集中处理输出。这样会方便不少。
平时我都是
for( int i = 0; i < num; i++ ){
scanf("%d",&a)
}
看来今后又可以解放双手,放更多精力在算法上面了。
Duang!自己又还是先把自己原来的坑填好,以下是利用string来实现IP地址验证的代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void check(char*);
int main(void)
{
int num, i;
char ip[500][18];
while (scanf("%d", &num) != EOF)
{
for (i = 0; i < num; i++)
{
scanf("%17s", ip[i]);
//最简单的输入还是scanf(“%d.%d.%d.%d”,....),省了不少事
}
for (i = 0; i < num; i++)
{
check(ip[i],i);
}
}
return 0;
}
void check(char is_ip[]) //!!!注意参数传递的问题,数组做参数传递时相当于指针
{
int j, length;
int sum = 0;
int point_num = 0;
length = strlen(is_ip);
for (j = 0; j < length; j++)
{
//如果输入有不是'.'或者阿拉伯数字的符号则会报错
if (!(is_ip[j] == '.' || (is_ip[j] <= '9'&&is_ip[j] >= '0')))
{
printf("No!\n");
return;
}
if (is_ip[j] == '.')
{
point_num += 1;
}
//如果输入的是数字,则把字符串变为数字
//if (is_ip[i][j] != '.' && is_ip[i][j] != '\0')
if (is_ip[j] >= '0'&&is_ip[j] <= '9')
{
sum = sum * 10 + is_ip[j] - '0';
}
//遇到'.'则计算一次整数的大小
else if (sum > 255 || sum < 0)
{
sum = 0;
printf("No!\n");
return;
}
//数字确定正确继续进行知道扫描完所有字符串
else
{
sum = 0;
continue;
}
}
//判断是跳出循环,还是检查完所有字符都无误;同时检查点是否够数
if (j >= length && point_num == 3)
printf("Yes!\n");
else if (point_num != 3)
printf("No!\n");
}
Debug之路简直不堪回首,第二个函数代码比较长,最后输出总是有超出限制。反复跟着代码走了很多遍已知不见效,最后发现错误出在传参是了。具体错误见下面代码:
void check(char is_ip[][18])
{
... ...
}
//实际调用时
check(ip[i]);
相当于,传入的是一个 char*,可是调用时变成了char**。 数组作为参数传递时相当于指针,这句话应该好好理解了。