九度OJ 1203 IP地址

来源:互联网 发布:淘宝店推荐知乎 编辑:程序博客网 时间:2024/05/08 09:39

题目描述:

    输入一个ip地址串,判断是否合法。

输入:

    输入的第一行包括一个整数n(1<=n<=500),代表下面会出现的IP地址的个数。
    接下来的n行每行有一个IP地址,IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。

输出:

    可能有多组测试数据,对于每组数据,如果IP地址合法则输出"Yes!”,否则输出"No!”。

样例输入:
2255.255.255.255512.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**。 数组作为参数传递时相当于指针,这句话应该好好理解了。

0 0