当前位置: 代码迷 >> 综合 >> 1116: IP判断
  详细解决方案

1116: IP判断

热度:90   发布时间:2024-02-12 10:21:15.0

题目描述
在基于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

解题思路:

算是贪心算法吧,当每个.前的格式符合规则,那么整串字符串也是符合规则的

注意事项:

1.求长度写成len=strlen(str);编译没办法通过

因为strlen()是用来求C风格字符串的长度的

string 是C++的对象。这样求长度str1.length();

  1. string中的每个元素其实上就是char类型

    这是由string 类的构造函数决定的

(原因如下可看可不看)

老祖宗模板类basic_string的原型:template<class CharType, class Traits = char_traits, class Allocator = allocator >class basic_string;

第一个参数Chartype:表示存储在basic_string字符串里的单个字符的数据类型。当CharType = char的时候,我们就定义了string类,如本文第二行所示

第二和第三个参数正如其名字,Trait(特点,特性),allocator(分配算符),一个描述了CharType元素的属性,另一个封装了有关字符串内存分配和解除分配的详细信息。它们都设有了默认值(等号= 后边的即是)。

参考代码:


```cpp
#include<iostream>#include<string.h>#include<string>using namespace std;int sign;//定义跳出标记为全局变量 int JUDGE (char a[100],int n) //数组做形参不需要指针啥的,因为数组本质上就是一个指针 {if(n>3){sign=1;return 0; } for(int i=0;i<n-1;i++){if(a[i]==0&&a[i+1]!=0){sign=1;return 0;}} }int judge(char s)   //判断字符串中的一个字符是否符合规则 {if(s<'0'||s>'9')//不是数字{if(s=='.')return 1; //是.返回1 elsereturn 0;//不是数字不是.返回0 } elsereturn 2;//是数字返回2 }int main(){string str;int len;  //输入字符串的长度char a[100];//用于判断字符串 int n=0; while(cin>>str){sign=0;//符合规则标记 len=str.length();for(int i=0;i<len;i++){if(judge(str[i])==0) //输入的字符不是数字不是.,sign为1 sign=1; if(judge(str[i])==1) //输入的字符是.{JUDGE(a,n); //判断.前面的是否符合规则 //数组做参数直接写数组名就完了 ,不需要加上[]n=0;     //把判断数组归零 }if(judge(str[i])==2) //输入的字符是数字{a[n]=str[i];n++;}if(sign==1)break;}if(sign==0)cout<<'Y'<<endl;elsecout<<'N'<<endl;}return 0;}