等等

Neither

Talk is cheap,show me the code!

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<string>
  4. using namespace std;
  5. int Char_to_Int(string, int, int);
  6. bool Judge_IPv4(string);
  7. bool Judge_IPv6(string);
  8. int main()
  9. {
  10. string s;
  11. getline( cin, s); //注意!使用cin会忽略空格,所以用getline来接收空格!
  12. if (Judge_IPv4(s))
  13. cout << "IPv4"; //如果是IPv4地址,输出IPv4
  14. else if (Judge_IPv6(s))
  15. cout << "IPv6"; //如果是IPv6地址,输出IPv6
  16. else
  17. cout << "Neither"; //都不是,输出Neither
  18. return 0;
  19. }
  20. bool Judge_IPv4(string s)
  21. {
  22. int len = s.length();
  23. if (s[ 0] == '.' || s[len - 1] == '.')
  24. return false; //如果第一个或最后一个字符是点,则不合法
  25. int count_dot = 0; //计数点个数,初始化为0
  26. for ( int i = 0; i < len; i++)
  27. {
  28. if ((s[i]< '0' || s[i]> '9') && s[i] != '.')
  29. return false; //如果字符不是数字,也不是点,则不合法
  30. if (s[i] == '.') //如果碰到点
  31. {
  32. count_dot++; //点数+1
  33. if (s[i + 1] == '.')
  34. return false; //如果有连续两个点,说明是空组,不合法
  35. int end = i - 1; //记录点之前的组的末位置
  36. int j = end;
  37. for (; j >= 0; j--) //从点之前的组的末位置往前扫描
  38. if (s[j] == '.') //如果碰到第二个点,跳出循环
  39. break;
  40. //如果没碰到点,说明点之前的组为起始组,j循环结束后为-1
  41. int start = j + 1; //记录点之后的组或起始组的起始位置
  42. if ((end-start+ 1)>= 2&&s[start] == '0')
  43. return false; //重点!如果当前组位数大于等于2且起始位置上的字符为0,说明是前导0,不合法
  44. int n = Char_to_Int(s, start, end); //将从起始位置开始到末位置之间的字符转换成数字
  45. if (start == 0) //因为起始组数的范围是1到255,故需要单独处理
  46. {
  47. if (n < 1 || n> 255)
  48. return false; //如果数值在1到255之外,则不合法
  49. }
  50. else if (n < 0 || n> 255)
  51. return false; //如果数值在0到255之外,则不合法
  52. }
  53. }
  54. if (count_dot != 3)
  55. return false; //如果点数不为3,则不合法
  56. for( int i=len -1;i>= 0;i--) //处理最后一组字符的情况,从末尾开始倒上来扫描
  57. if (s[i] == '.') //如果碰到点
  58. {
  59. int start = i + 1; //记录点之后的组的起始位置
  60. int end = len - 1; //记录点之后的组的末位置即字符串的末位置
  61. if ((end - start + 1) >= 2 && s[start] == '0')
  62. return false; //重点!如果当前组位数大于等于2且起始位置上的字符为0,说明是前导0,不合法
  63. int n = Char_to_Int(s, start, end); //将从起始位置开始到末位置之间的字符转换成数字
  64. if (n < 0 || n> 255)
  65. return false; //如果数值在0到255之外,则不合法
  66. break; //注意!处理完后要及时跳出循环!
  67. }
  68. return true;
  69. }
  70. int Char_to_Int(string s, int start, int end)
  71. { //将字符转换为数字
  72. int len = s.length();
  73. //如果单独看此函数,则需要判定形参start和end是否合法
  74. if (start < 0 || end == len||start>end)
  75. {
  76. cout << "Illegal Subscript!";
  77. exit( 0);
  78. }
  79. int num = 0;
  80. for ( int i = start; i <= end; i++)
  81. num = num * 10 + (s[i] - '0'); //将当前字符的ASCII码减去0的ASCII码即当前字符对应的数字
  82. //然后按照10进制从高位到低位累加和
  83. return num;
  84. }
  85. bool Judge_IPv6(string s)
  86. {
  87. int len = s.length();
  88. if (s[ 0] == ':' || s[len - 1] == ':')
  89. return false; //如果第一个或最后一个字符是冒号,则不合法
  90. int count_colon = 0; //计数冒号数,初始化为0
  91. int count_bit= 0; //计数每组位数,初始化为0
  92. for ( int i = 0; i < len; i++)
  93. {
  94. if ((s[i]< 'a' || s[i] > 'f') && (s[i] < 'A' || s[i] > 'F') && (s[i] < '0' || s[i] > '9')&&s[i]!= ':')
  95. return false; //如果字符不是16进制中的字母,不是数字,也不是冒号,则不合法
  96. count_bit++; //如果字符合法,则位数+1
  97. if (s[i] == ':') //如果碰到冒号
  98. {
  99. count_bit = 0; //位数清0,重新计数
  100. count_colon++; //冒号数+1
  101. if (s[i + 1] == ':')
  102. return false; //如果有连续两个冒号,说明是空组,不合法
  103. }
  104. if (count_bit > 4) //如果每组位数超过4,则不合法
  105. return false;
  106. }
  107. if (count_colon != 7) //如果冒号数不为7,则不合法
  108. return false;
  109. return true;
  110. }

Neither

Talk is cheap,show me the code!

  1. #include<iostream>
  2. #include<cstdlib>
  3. #include<string>
  4. using namespace std;
  5. int Char_to_Int(string, int, int);
  6. bool Judge_IPv4(string);
  7. bool Judge_IPv6(string);
  8. int main()
  9. {
  10. string s;
  11. getline( cin, s); //注意!使用cin会忽略空格,所以用getline来接收空格!
  12. if (Judge_IPv4(s))
  13. cout << "IPv4"; //如果是IPv4地址,输出IPv4
  14. else if (Judge_IPv6(s))
  15. cout << "IPv6"; //如果是IPv6地址,输出IPv6
  16. else
  17. cout << "Neither"; //都不是,输出Neither
  18. return 0;
  19. }
  20. bool Judge_IPv4(string s)
  21. {
  22. int len = s.length();
  23. if (s[ 0] == '.' || s[len - 1] == '.')
  24. return false; //如果第一个或最后一个字符是点,则不合法
  25. int count_dot = 0; //计数点个数,初始化为0
  26. for ( int i = 0; i < len; i++)
  27. {
  28. if ((s[i]< '0' || s[i]> '9') && s[i] != '.')
  29. return false; //如果字符不是数字,也不是点,则不合法
  30. if (s[i] == '.') //如果碰到点
  31. {
  32. count_dot++; //点数+1
  33. if (s[i + 1] == '.')
  34. return false; //如果有连续两个点,说明是空组,不合法
  35. int end = i - 1; //记录点之前的组的末位置
  36. int j = end;
  37. for (; j >= 0; j--) //从点之前的组的末位置往前扫描
  38. if (s[j] == '.') //如果碰到第二个点,跳出循环
  39. break;
  40. //如果没碰到点,说明点之前的组为起始组,j循环结束后为-1
  41. int start = j + 1; //记录点之后的组或起始组的起始位置
  42. if ((end-start+ 1)>= 2&&s[start] == '0')
  43. return false; //重点!如果当前组位数大于等于2且起始位置上的字符为0,说明是前导0,不合法
  44. int n = Char_to_Int(s, start, end); //将从起始位置开始到末位置之间的字符转换成数字
  45. if (start == 0) //因为起始组数的范围是1到255,故需要单独处理
  46. {
  47. if (n < 1 || n> 255)
  48. return false; //如果数值在1到255之外,则不合法
  49. }
  50. else if (n < 0 || n> 255)
  51. return false; //如果数值在0到255之外,则不合法
  52. }
  53. }
  54. if (count_dot != 3)
  55. return false; //如果点数不为3,则不合法
  56. for( int i=len -1;i>= 0;i--) //处理最后一组字符的情况,从末尾开始倒上来扫描
  57. if (s[i] == '.') //如果碰到点
  58. {
  59. int start = i + 1; //记录点之后的组的起始位置
  60. int end = len - 1; //记录点之后的组的末位置即字符串的末位置
  61. if ((end - start + 1) >= 2 && s[start] == '0')
  62. return false; //重点!如果当前组位数大于等于2且起始位置上的字符为0,说明是前导0,不合法
  63. int n = Char_to_Int(s, start, end); //将从起始位置开始到末位置之间的字符转换成数字
  64. if (n < 0 || n> 255)
  65. return false; //如果数值在0到255之外,则不合法
  66. break; //注意!处理完后要及时跳出循环!
  67. }
  68. return true;
  69. }
  70. int Char_to_Int(string s, int start, int end)
  71. { //将字符转换为数字
  72. int len = s.length();
  73. //如果单独看此函数,则需要判定形参start和end是否合法
  74. if (start < 0 || end == len||start>end)
  75. {
  76. cout << "Illegal Subscript!";
  77. exit( 0);
  78. }
  79. int num = 0;
  80. for ( int i = start; i <= end; i++)
  81. num = num * 10 + (s[i] - '0'); //将当前字符的ASCII码减去0的ASCII码即当前字符对应的数字
  82. //然后按照10进制从高位到低位累加和
  83. return num;
  84. }
  85. bool Judge_IPv6(string s)
  86. {
  87. int len = s.length();
  88. if (s[ 0] == ':' || s[len - 1] == ':')
  89. return false; //如果第一个或最后一个字符是冒号,则不合法
  90. int count_colon = 0; //计数冒号数,初始化为0
  91. int count_bit= 0; //计数每组位数,初始化为0
  92. for ( int i = 0; i < len; i++)
  93. {
  94. if ((s[i]< 'a' || s[i] > 'f') && (s[i] < 'A' || s[i] > 'F') && (s[i] < '0' || s[i] > '9')&&s[i]!= ':')
  95. return false; //如果字符不是16进制中的字母,不是数字,也不是冒号,则不合法
  96. count_bit++; //如果字符合法,则位数+1
  97. if (s[i] == ':') //如果碰到冒号
  98. {
  99. count_bit = 0; //位数清0,重新计数
  100. count_colon++; //冒号数+1
  101. if (s[i + 1] == ':')
  102. return false; //如果有连续两个冒号,说明是空组,不合法
  103. }
  104. if (count_bit > 4) //如果每组位数超过4,则不合法
  105. return false;
  106. }
  107. if (count_colon != 7) //如果冒号数不为7,则不合法
  108. return false;
  109. return true;
  110. }

猜你喜欢

转载自blog.csdn.net/cpongo1/article/details/80818855
今日推荐