点分十进制数值无前导零(0)。soj1103 AC。
#include <iostream>
#include <string>
using namespace std;
int read_digits(string s, int idx)
{
int l = s.length(), i = idx;
int d = 0;
for (; i < l; i++)
{
if (s[i] >= '0' && s[i] <= '9')
{
if (i - idx >= 3) return -1;
if (i - idx > 0 && d == 0) return -1; // prefix 0
d = 10 * d + (s[i] - '0');
if (d > 255) return -1;
}
else if (s[i] == '.')
{
if (i == idx) return -1;
return i;
}
else return -1;
}
return i;
}
bool isLegal(string s)
{
int l = s.length(), i = 0, j = 0;
i = read_digits(s, i);
if (i == -1 || i >= l) return false;
i = read_digits(s, i + 1);
if (i == -1 || i >= l) return false;
i = read_digits(s, i + 1);
if (i == -1 || i >= l) return false;
j = i + 1;
i = read_digits(s, i + 1);
if (i == -1 || i < l || i == j) return false;
return true;
}
int main()
{
string s;
while (cin >> s)
cout << (isLegal(s) ? "YES" : "NO") << endl;
return 0;
}