Advertisement
gha890826

0514-bonus IP位址格式判斷

May 14th, 2021
893
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.27 KB | None | 0 0
  1. #include<iostream>
  2. #include<string>
  3. #include <stdlib.h>
  4. #include <algorithm>
  5. using namespace std;
  6.  
  7. int main()
  8. {
  9.     string n;
  10.     while(cin>>n)
  11.     {
  12.         if(n.find(".")!=string::npos)
  13.             goto IPV4;
  14.         else if(n.find(":")!=string::npos)
  15.         {
  16.             goto IPV6;
  17.         }
  18.         else
  19.             goto NO;
  20.        
  21.         IPV4:
  22.             {
  23.                 string sub[4]={""};
  24.                 int pos[4]={0};
  25.                 for(int i=1;i<4;i++)
  26.                 {
  27.                     if(n.find(".",pos[i-1]+1)!=string::npos)
  28.                         pos[i]=n.find(".",pos[i-1]+1)+1;
  29.                     else
  30.                         goto NO;
  31.                     sub[i-1]=n.substr(pos[i-1],pos[i]-pos[i-1]-1);
  32.                 }
  33.                 sub[3]=n.substr(pos[3]);
  34. //              for(int i=0;i<4;i++)
  35. //              {
  36. //                  cout<<"***"<<sub[i]<<endl;
  37. //              }
  38.                
  39.                 for(int i=0;i<4;i++)
  40.                 {
  41.                     for(int j=0;j<sub[i].length();j++)
  42.                     {
  43.                         if(!isdigit(sub[i][j]))
  44.                             goto NO;
  45.                     }
  46.                     if(sub[i].length()!=1&&sub[i][0]=='0')
  47.                         goto NO;
  48.                     if(atoi(sub[i].c_str())>255||atoi(sub[i].c_str())<0)
  49.                         goto NO;
  50.                 }
  51.                
  52.                 cout<<"IPv4\n";
  53.                 goto END;
  54.             }
  55.            
  56.         IPV6:
  57.             {
  58.                 string sub[8]={""};
  59.                 int pos[8]={0};
  60.                 for(int i=1;i<8;i++)
  61.                 {
  62.                     if(n.find(":",pos[i-1]+1)!=string::npos)
  63.                         pos[i]=n.find(":",pos[i-1]+1)+1;
  64.                     else
  65.                         goto NO;
  66.                     sub[i-1]=n.substr(pos[i-1],pos[i]-pos[i-1]-1);
  67.                 }
  68.                 sub[7]=n.substr(pos[7]);
  69. //              for(int i=0;i<8;i++)
  70. //              {
  71. //                  cout<<"+++"<<sub[i]<<endl;
  72. //              }
  73.                
  74.                 for(int i=0;i<8;i++)
  75.                 {
  76. //                  transform(sub[i].begin(),sub[i].end(),sub[i].begin(),::tolower);
  77.                     if(sub[i].length()>4||sub[i].length()<0)
  78.                         goto NO;
  79.                     if(sub[i][0]=='0'&&sub[i].length()!=1)
  80.                         if(sub[i][1]=='0')
  81.                             goto NO;
  82.                     for(int j=0;j<sub[i].length();j++)
  83.                     {
  84.                         if(!isdigit(sub[i][j]))
  85.                             if((char)tolower(sub[i][j])>'f')
  86.                                 goto NO;
  87.                     }
  88.                 }
  89.                
  90.                 cout<<"IPv6\n";
  91.                 goto END;
  92.             }
  93.            
  94.         NO:
  95.             cout<<"N\n";
  96.            
  97.         END:
  98.             ;
  99.     }
  100. }
  101.  
  102. //輸入說明:
  103. //
  104. //每筆資料會輸入一行IP位址 直到EOF
  105. //
  106. //輸出說明:
  107. //
  108. //判斷輸入的值是否為合法的IP位址
  109. //若為IPv4 輸出IPv4
  110. //若為IPv6 輸出IPv6
  111. //兩者皆非輸出N
  112. //
  113. //SAMPLE INPUT:
  114. //
  115. //172.16.254.1
  116. //2001:0db8:85a3:0:0:8A2E:0370:7334
  117. //256.256.256.256
  118. //2001:0db8:85a3:0:0:8A2E:0370:7334:
  119. //1e1.4.5.6
  120. //
  121. //SAMPLE OUTPUT:
  122. //
  123. //IPv4
  124. //IPv6
  125. //N
  126. //N
  127. //N
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement