HDu 2206 IPの計算


IPの計算
Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 2686    Accepted Submission(s): 488
Problem Description
インターネットの授業で、IPに関する多くの知識を学びました.IPのフルネームはインターネットプロトコルと呼ばれて、时には私达はまたIPで私达のIPネットワークのアドレスを指して、今IPV 4の下で1つの32ビットの符号のない整数で表して、一般的に点分けの方式で表示して、点はIPアドレスを4つの部分に分けて、各部分は8ビットで、1つの符号のない整数を表して(そのためプラス記号で现れる必要はありません)、例えば192.168.100.16、私达のとても熟知しているIPアドレスで、1つのIPアドレス列にスペースは表示されません(32数字で表すため).
しかし、不注意な私は、よくIPアドレスを書き間違えて、今あなたがプログラムで判断する必要があります.
Input
複数のcaseが入力され、各caseには100文字を超えない行があります.
Output
各caseについて,入力したIPが正しいか否かを判断し,YESが正しく入力されている場合はNOとする.
Sample Input
192.168.100.16
Sample Output
YES
Author
wangye
Recommend
wangye
簡単に見えるものには落とし穴があり、主に以下の4点に注意します:<1>検査時に先頭と接尾辞のスペースをフィルタします<2>4セグメントの数字の桁数は3ビットを超えてはいけません.例えば000.00.000.000.000.000.0000は正しいですが、     0000.000.000.000.000.000誤った<3>区切り記号点の個数は3であり、多くなっても少なくなっても<4>各セグメント値は255を超えてはならない
私のコードは、長いので、メモリを浪費していますが、まだできます.記録してください.

#include <stdio.h>
#include <string.h>

int check_num(char s[], int st, int end)
{
    int i, k = 0, tag = 0;
    if(end - st > 3)
        return 0;
    for( i = st; i < end; i++)
    {
        if(s[i] >= '0' && s[i] <= '9')
        {
            k = k * 10 + s[i] - '0';
            tag = 1;    
        }    
        else
            return 0;
    }
    if(k > 255 || tag == 0)
        return 0;
    //printf("k = %d
", k); return 1; } int check_ip(char s[]) { int len = strlen(s); int st, end; int dotp[4], ip[4]; int dn = 0; int i, j, k, res; for(i = 0; s[i] == ' '; i++) ; // process the backspace before number st = i; for(i = len - 1; s[i] == ' '; i--) ; //process the backspace after number end = i + 1; k = 0; for(i = st; i < end; i++) { if(s[i] == '.') { dn++; if(dn > 3) // more than 3, break break; dotp[k++] = i; } } if(dn != 3) // dot number is not 3 { return 0; } for(i = 0; i < 4; i++) { switch(i) { case 0: res = check_num(s, st, dotp[0]); break; case 1: case 2: res = check_num(s, dotp[i - 1] + 1, dotp[i]); break; case 3: res = check_num(s, dotp[i - 1] + 1, end); break; } if(res == 0) { return 0; } } return 1; } int main() { char s[101]; int res; while(gets(s) != NULL) { res = check_ip(s); if(!res) printf("NO
"); else printf("YES
"); } return 0; }