解题思路:
        先将整体的输入看作一个字符串,然后每隔一个'.'(IP表示中的那个点)进行一次分隔,分割成一个新的字符串,利用atoi函数将这个字符串直接转换成整形数,再通过判断整形数字是否合格来决定这个IP是否是一个合格的IP(什么,你说如果输入字母怎么办?那就直接在分割的时候排除了吧。)、


     介绍两个函数:

    1.atoi函数,atoi (表示 ascii to integer)是把字符串转换成整型数的一个函数。int atoi(const char *nptr) 函数会扫描参数 nptr字符串,会跳过前面的空白字符(例如空格,tab缩进)等。如果 nptr不能转换成 int 或者 nptr为空字符串,那么将返回 0  。特别注意,该函数要求被转换的字符串是按十进制数理解的。

    注意,扫描一个字符串,这个字符串需要以'\0'结尾,我们做分割的时候一定要记住在其末尾添加\0,否则会出错。

    

    2.memset函数,memset是计算机中C/C++语言初始化函数。将s所指向的某一块内存中的后n个 字节的内容全部设置为ch指定的ASCII值, 第一个值为指定的内存地址,块的大小由第三个参数指定,这个函数通常为新申请的内存做初始化工作, 其返回值为s。

    其使用为 char a[100]; memset(a,0,100)或者memset(a,0,sizeof(a));使用sizeof的好处是不需要自己手动计算他的空间了,memset常常是和sizeof混合在一起用的。

    上面这一句话意思是将a[100]全部初始化为0;和char a[100]={0}相当,由于可以在任何地方使用还是比较常见的。


    利用这两个函数的特性,可以方便我们进行分割并且判断,同时也方便我们减少空间使用。


参考代码:

#include<bits/stdc++.h>
using namespace std;
const int Max=300;
int main() {
	char str[Max],tt[Max];
	while(cin>>str) {
		bool flag=true;        //标记位
		for(int i=0,k=0; i<strlen(str); i++) {
			if((str[i]<'0'||str[i]>'9')&&str[i]!='.') {
				flag=false;
				break;
			} else if(str[i]!='.') {
				tt[k++]=str[i];
			} else if(str[i]=='.'||i==strlen(str)-1) {
				tt[k]='\0';
				int ak;
				ak=atoi(tt);
				if(ak<0||ak>255) {
					flag=false;
					break;
				}
				memset(tt,0,sizeof(tt));
				k=0;
			}
		}
		if(flag)
			cout<<'Y'<<endl;
		else
			cout<<'N'<<endl;
	}
	return 0;
}

另外,这一个题解还有一点点小问题待解决,你能够发现这个小问题么?

PS:直接复制这个题解并提交OJ系统的话是正确的。

点赞(1)
 

0.0分

1 人评分

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

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

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

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

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

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

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

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

评论列表 共有 2 条评论

UDP广播协议叫吃饭 5年前 回复TA
@夏天 是的,谢谢你的改进
夏天 5年前 回复TA
问题就是对于前导0的时候仍然会输出Y,我对这个进行了改动,详见我的解答,谢谢您提供的思路,特别简洁,很棒!