输入一个ip地址串,判断是否合法。每行有一个IP地址,IP地址的形式为a.b.c.d,其中a、b、c、d都是整数。
ANSWER1:
将字符串类型定义为string类(注意字符串的下标顺序。abcdefg的下标从左到右的顺序为0123456,而不是6543210)
再分别将字符串转换为int型整数:==ip=ip+(str[i]-‘0’)*t;==利用下标分别计算。
代码:
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
using namespace std;
bool test(int x,int y,string str){
int ip=0,t=1;;
for(int i=y;i>=x;i--){
ip=ip+(str[i]-'0')*t;
t=t*10;
}
if(ip>=0&&ip<=255) return 1;
else return 0;
}
int main()
{
string str;
while(cin>>str){
int len=str.length();//注意这个求长度的函数,貌似strlen()不行
int dot[3]={0},t=0;
for(int i=0;i<len;i++){
if(str[i]=='.'){
dot[t]=i;
t++;
}
}
int a,b,c,d;
a=test(0,dot[0]-1,str);
b=test(dot[0]+1,dot[1]-1,str);
c=test(dot[1]+1,dot[2]-1,str);
d=test(dot[2]+1,len-1,str);
if(a+b+c+d==4) cout<<"Yes!"<<endl;
else cout<<"No!"<<endl;
}
return 0;
}
ANSWER2:
将字符串定义为char[]数组,遍历字符串,在未遇到’.‘之前就一直计数,并且一边计数一边判断是否在0~255的范围内(不用等到算完才判断),一旦超过范围,break;不超过则continue;并且弄一个标志位,标记到最后是否有超过范围的;其次,更重要的是,若遇到’.’,应该讲计数器调制初始状态继续计数下一个。
代码:
#include<stdlib.h>
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
bool abcd(char *a){
int len=strlen(a);
int x=0,r=1,y=0;
for(int i=len-1;i>=0;i--){
if(a[i]!='.'){
x=x+(a[i]-'0')*r;
r=r*10;
if(x>=0&&x<=255) {continue;}
else {y++;break;}
}
else{
x=0;
r=1;
}
}
if(y==0) return 1;
else return 0;
}
int main(){
char b[15];
while(cin>>b){
bool t=abcd(b);
if(t==1) cout<<"Yes!"<<endl;
else cout<<"No!"<<endl;
}
return 0;
}
总结:
1.将字符串转化为整数型数字时,从后面个位开始
2.别漏了(a[i]-‘0’)的转换