题目描述
在基于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();
-
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;}