九度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
- 九度OJ 题目1203:IP地址
- 九度OJ 1203 IP地址
- 九度oj-1203-IP地址
- 【九度OJ】1203:IP地址
- 九度OJ 1203:IP地址 (字符串处理)
- 【九度OJ】题目1203:IP地址 解题报告
- 九度oj 1203
- BUPT OJ IP地址
- 九度oj 题目1475:IP数据包解析
- 【九度OJ】题目1475:IP数据包解析 解题报告
- BUPT OJ 101 IP地址
- 【九度OJ】:九度OJ 1050
- 【九度OJ】:九度OJ 1053
- 【九度OJ】:九度OJ 1056
- 【九度OJ】:九度OJ 1059
- 【九度OJ】:九度OJ 1206
- 九度OJ:1000
- 【九度OJ】 1006
- android软键盘隐藏总结
- 【Android开发经验】Android开发相关的Blog推荐——跟随大神的脚步才能成长为大神
- 用归纳递归实现插入排序
- JavaScript闭包作用域变量问题
- PHP 数组详解
- 九度OJ 1203 IP地址
- java nio 精华
- 爬山法处理基于颜色的图像分割
- [C++] STL (Algorithm,bitset)
- leetcode--Letter Combinations of a Phone Number
- 黑马程序员——Java学习笔记 String类和基本数据类型对象包装类
- TalkingData Ad Tracking开启反作弊模式
- fgdfgfgsfgsgsfgs
- 小知识点日志(2014-10-22~2015-4-7)