[关闭]
@songpfei 2016-04-07T01:30:32.000000Z 字数 2717 阅读 2562

IP地址判断有效性

OJ_算法


1.题目

2 代码实现

版本1:

  1. int ConvertSubIPToInt(const char* sub_ip)
  2. {
  3. if (sub_ip == NULL)
  4. return -1;
  5. int length = strlen(sub_ip);
  6. if (length < 1 || length>3)
  7. return -1;
  8. int sub_value = 0;
  9. for (int i = 0; i < length; i++)
  10. {
  11. if (sub_ip[i]<'0' || sub_ip[i]>'9')
  12. return -1;
  13. sub_value = 10 * sub_value + sub_ip[i] - '0';
  14. }
  15. if (sub_value != 0 && sub_ip[0] == '0')//01.2.3.4 无效
  16. return -1;
  17. return sub_value;
  18. }
  19. bool isIPAddressValid(const char* pszIPAddr)
  20. {
  21. // 请在此处实现
  22. if (pszIPAddr == NULL || *pszIPAddr == '\0')
  23. return false;
  24. int szIPAddr_length = strlen(pszIPAddr);
  25. int index_start = 0;
  26. int index_end = szIPAddr_length - 1;
  27. //去除前边的空格
  28. while (pszIPAddr[index_start] == ' ')
  29. {
  30. ++index_start;
  31. }
  32. //去除后边空格
  33. while (pszIPAddr[index_end] == ' ')
  34. {
  35. --index_end;
  36. }
  37. if (index_end <= index_start)
  38. return false;
  39. int ip_length = index_end - index_start + 2;
  40. char *temp_ip=(char*)malloc(ip_length);
  41. strncpy(temp_ip, pszIPAddr + index_start, ip_length-1);
  42. temp_ip[ip_length - 1] = '\0';
  43. char* sub_ip = strtok(temp_ip, ".");
  44. int sub_ip_count = 0;
  45. int sub_ip_value;
  46. while (sub_ip != NULL)//ip分段,计数分段ip,并转换为0-255
  47. {
  48. sub_ip_count++;
  49. if (sub_ip_count > 4)
  50. {
  51. free(temp_ip);
  52. return false;
  53. }
  54. sub_ip_value= ConvertSubIPToInt(sub_ip);
  55. if (sub_ip_value < 0 || sub_ip_value > 255)
  56. {
  57. free(temp_ip);
  58. return false;
  59. }
  60. sub_ip = strtok(NULL, ".");
  61. }
  62. free(temp_ip);
  63. if (sub_ip_count != 4)
  64. return false;
  65. else
  66. return true;
  67. }

版本2:

  1. bool isIPAddressValid(const char* pszIPAddr)
  2. {
  3. // 请在此处实现
  4. if (pszIPAddr == NULL || *pszIPAddr == '\0')
  5. return false;
  6. size_t szIPAddr_length = strlen(pszIPAddr);
  7. bool isValid = true;
  8. size_t index_start = 0;
  9. size_t index_end = szIPAddr_length - 1;
  10. //去除前边的空格
  11. while (pszIPAddr[index_start] == ' ')
  12. {
  13. ++index_start;
  14. }
  15. //去除后边空格
  16. while (pszIPAddr[index_end] == ' ')
  17. {
  18. --index_end;
  19. }
  20. int sub_value = 0;//转换每个子段的值
  21. int dot_mark_count = 0;//统计字符'.'的个数
  22. size_t sub_fisrt = index_start;//记录每个子段的第一个字符位置
  23. for (size_t i = index_start; i <= index_end + 1; i++)
  24. {
  25. if (pszIPAddr[i] >= '0'&&pszIPAddr[i] <= '9')
  26. {
  27. sub_value = 10 * sub_value + pszIPAddr[i] - '0';
  28. }
  29. else if (pszIPAddr[i] == '.' || i == index_end + 1)
  30. {
  31. if (i == index_start || pszIPAddr[i - 1] < '0' || pszIPAddr[i - 1]>'9')//判断第一位或者.的前后是否有数字
  32. return false;
  33. if (pszIPAddr[i] == '.')//统计点'.'的个数
  34. {
  35. dot_mark_count++;
  36. if (dot_mark_count > 3)
  37. return false;
  38. }
  39. if (sub_value < 0 || sub_value>255)
  40. return false;
  41. if (sub_value != 0 && pszIPAddr[sub_fisrt] == '0')
  42. return false;
  43. sub_value = 0;//子段识别完毕,重新转换下一子段值
  44. sub_fisrt = i + 1;
  45. }
  46. else
  47. return false;
  48. }
  49. if (dot_mark_count != 3)//统计点'.'的个数
  50. return false;
  51. return true;
  52. }
  1. 合法IP判断:
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include<stdio.h>
  3. #include<string.h>
  4. #include<stdlib.h>
  5. int main()
  6. {
  7. int ip[4];
  8. if (scanf("%d.%d.%d.%d", ip, ip + 1, ip + 2, ip + 3) == 4)
  9. {
  10. for (int i = 0; i < 4; i++)
  11. {
  12. if (ip[i] < 0 || ip[i]>255)
  13. {
  14. puts("NO");
  15. return 0;
  16. }
  17. }
  18. /*if (ip[0] == 0 && ip[1] ==0 && ip[2] ==0 && ip[3] ==0 )
  19. {
  20. puts("NO");
  21. return 0;
  22. }*/
  23. puts("YES");
  24. }
  25. else
  26. puts("NO");
  27. return 0;
  28. }
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注