在基于Internet的程序中,我们常常需要判断一个IP字符串的合法性。
合法的IP是这样的形式:
A.B.C.D
其中A、B、C、D均为位于[0, 255]中的整数。为了简单起见,我们规定这四个整数中不允许有前导零存在,如001这种情况。
现在,请你来完成这个判断程序吧^_^
输入
输入由多行组成,每行是一个字符串,输入由“End of file”结束。
字符串长度最大为30,且不含空格和不可见字符
输出
对于每一个输入,单独输出一行
如果该字符串是合法的IP,输出Y,否则,输出N
样例输入
1.2.3.4
a.b.c.d
267.43.64.12
12.34.56.bb
210.43.64.129
-123.4.5.6
样例输出
Y
N
N
N
Y
N
题意很简单,就是判断这个IP合不合要求,但不好想的是怎么对“.”进行分隔来判断每个位置上的字符串。我们可以考虑用scanf控制输入格式的功能。
因为我们要判断的是数字,所以可以用scanf(“%d.%d.%d.%d”)来输入每个段上的数字,这里用a,b,c,d四个变量来存储这四个值,如果输入的数字那么可以直接判断,但是如果输入的是字母呢?scanf遇到不匹配的则直接结束执行。我们可以在每次输入前为a,b,c,d四个变量赋初值,这个初值是其它不在0-255的数,这样的话,如果输入的是字符,当然就不符合题意
但是输入类似a.b.c.d时,程序会循环打印N,分析原因,因为我们输入的a.b.c.d还留在输入缓存区里,我一开始想使用fflush(stdin)来实现,但发现OJ评判错误,查阅资料后发现“上网查阅资料后发现(转自https://my.oschina.net/deanzhao/blog/79790):其实C和C++的标准里从来没有定义过 fflush(stdin)。某些编译器(如VC6)支持用 fflush(stdin) 来清空输入缓冲,但是并非所有编译器都要支持这个功能(linux 下的 gcc 就不支持),因为标准中根本没有定义 fflush(stdin)。MSDN 文档里 也清楚地写着fflush on input stream is an extension to the C standard(fflush 操作输入流是对 C 标准的扩充)。当然,如果你毫不在乎程序的移植性,用 fflush(stdin) 也没什么大问题。”。其实想想这个并不难实现,只要使用getchar()函数就可以了,直到遇到’\n’。
具体描述见此网站https://blog.csdn.net/weixin_34216196/article/details/94540740

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. #define p(n) (n<0||n>255)? 1:0
  4. int a=-1,b=-1,c=-1,d=-1;
  5. char ch;
  6. int main()
  7. { while(scanf("%d.%d.%d.%d",&a,&b,&c,&d)!=EOF)
  8. {
  9. if(p(a)||p(b)||p(c)||p(d))
  10. {
  11. cout<<"N"<<endl;
  12. }
  13. else
  14. cout<<"Y"<<endl;
  15. while((ch=getchar())!=EOF&&ch!='\n');
  16. a=-1;
  17. b=-1;
  18. c=-1;
  19. d=-1;
  20. }
  21. return 0;
  22. }
点赞(0)
 

0 分

0 人评分

 

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论