在基于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
#include <bits/stdc++.h>
using namespace std;
#define p(n) (n<0||n>255)? 1:0
int a=-1,b=-1,c=-1,d=-1;
char ch;
int main()
{ while(scanf("%d.%d.%d.%d",&a,&b,&c,&d)!=EOF)
{
if(p(a)||p(b)||p(c)||p(d))
{
cout<<"N"<<endl;
}
else
cout<<"Y"<<endl;
while((ch=getchar())!=EOF&&ch!='\n');
a=-1;
b=-1;
c=-1;
d=-1;
}
return 0;
}
0 分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复