2012北邮网研真题C-IP地址

题目

2012北邮网研真题C-IP地址
2012北邮网研真题C-IP地址

代码

//IP地址
#include <iostream>
#include <string.h>
using namespace std;

char a[20];

int main() {
	int T;
	cin >> T;
	while(T--) {

		memset(a, 0, sizeof(a)); //把字符数组初始为'\0'  '\0'的ASCII是0

		cin >> a;
		int p = 0, start = 0, tmp = 0;
		while(a[p] != '.' && p < 20) {
			p++;
			//cout << p << endl;
		}
		if(p == 0) {
			cout << "No" << endl;
			continue;
		}
		bool flag = true;
		for(int i = 0; i < p; i++) {
			if(a[i] < '0' || a[i] > '9') {
				flag = false;
				break;
			}

			tmp = tmp*10 + a[i]-'0';

		}
		if(tmp > 255 || tmp < 0 || flag == false) {
			//cout << "11111111111111111" << endl;
			cout << "No" << endl;
			continue;
		}
		p++;
		start = p;
		tmp = 0;
		flag = true;
		while(a[p] != '.' && p < 20) {
			p++;
		}
		if(p == start) {
			cout << "No" << endl;
			continue;
		}
		for(int i = start; i < p; i++) {
			if(a[i] < '0' || a[i] > '9') {
				flag = false;
				break;
			}
			tmp = tmp*10 + a[i]-'0';

		}
		if(tmp > 255 || tmp < 0 || flag == false) {
			//cout << "222222222222222222" << endl;
			cout << "No" << endl;
			continue;
		}
		p++;
		start = p;
		tmp = 0;
		flag = true;
		while(a[p] != '.' && p < 20) {
			p++;
		}
		if(p == start) {
			cout << "No" << endl;
			continue;
		}
		for(int i = start; i < p; i++) {
			if(a[i] < '0' || a[i] > '9') {
				flag = false;
				break;
			}
			tmp = tmp*10 + a[i]-'0';
			
		}
		if(tmp > 255 || tmp < 0 || flag == false) {
//			cout << tmp << endl;
//			cout << p << endl;
//			cout << "33333333333333333333333" << endl;
			cout << "No" << endl;
			continue;
		}
		p++;
		start = p;
		tmp = 0;
		flag = true;
		while(a[p] != '\0' && p < 20) {
			p++;
		}
		if(p == start) {
			cout << "No" << endl;
			continue;
		}
		for(int i = start; i < p; i++) {
			if(a[i] < '0' || a[i] > '9') {
				flag = false;
				break;
			}
			tmp = tmp*10 + a[i]-'0';

		}
		if(tmp > 255 || tmp < 0 || flag == false) {
			//cout << "4444444444444444" << endl;
			cout << "No" << endl;
			continue;
		}
		cout << "Yes" << endl;
	}
	return 0;
}

测试

我测试了用例1.1.1,我一直没想出来为什么程序判断出no。后来才发现是在初始化的时候是把字符数组设成了ASCII码0,对应的就是’\0’。因为迟迟没有找到那个“.”,所以此时p=20了,进入下面的for循环时,因为a[i]的值是’\0’,对应ASCII码是0,自然比‘0’要小,flag变为false,进入下面的if判断语句。
2012北邮网研真题C-IP地址2012北邮网研真题C-IP地址

运行结果

2012北邮网研真题C-IP地址