C++ IP 地址合法性检查代码优化与修复 - 提高代码质量和效率
问题:\n1. 代码中使用了#include<bits\/stdc++.h>这样的头文件,这是非标准的写法,不建议使用。应该根据实际需要引入相应的头文件,例如#include<iostream>和#include<string>。\n2. 使用using namespace std;会导致命名空间污染,不建议使用。可以使用std::前缀来指定命名空间,例如std::string和std::cout。\n3. 在循环中使用s.length()作为循环的条件,这样每次循环都会重新计算字符串的长度,效率较低。应该在循环外将字符串的长度保存到一个变量中,然后在循环中使用该变量。\n4. 在判断字符是否为数字时,使用了if (s[i]>='1'&&s[i]<='9'),这样只能判断字符是否为1到9之间的数字,不能判断0是否为数字。应该使用if (s[i]>='0'&&s[i]<='9')来判断字符是否为数字。\n5. 在判断字符是否为多余的字符时,使用了if (s[i]!='.'||s[i]!='0'&&s[i]!='.'),这样的逻辑是错误的。应该使用if (s[i]!='.' && s[i]!='0')来判断字符是否为多余的字符。\n6. 在判断是否有四个整数时,使用了if (cnt!=4) a[3]=temp;,这样的逻辑是错误的。应该使用if (cnt!=3) flag=false;来判断是否有四个整数。\n7. 在输出修正后的地址时,使用了printf("%d.%d.%d.%d",a[0],a[1],a[2],a[3]);,这是C语言的写法,不适用于C++。应该使用std::cout来输出。\n8. 缺少对输入合法性的检查,例如输入的字符串是否为空,是否包含非法字符等。\n\n修改后的代码如下:\n\ncpp\n#include <iostream>\n#include <string>\n\nint main() {\n std::string s;\n std::cin >> s;\n \n bool flag = true;\n int a[4], temp = 0, cnt = 0;\n for (int i = 0; i < s.length(); i++) {\n if (s[i] >= '0' && s[i] <= '9') {\n temp = temp * 10 + (s[i] - '0');\n } else {\n if (s[i] != '.' && s[i] != '0') {\n flag = false;\n }\n if (temp) {\n a[cnt] = temp;\n temp = 0;\n cnt++;\n }\n }\n }\n if (cnt != 3) {\n flag = false;\n }\n a[3] = temp;\n for (int i = 0; i < 4; i++) {\n if (a[i] > 255) {\n flag = false;\n a[i] = 255;\n }\n }\n \n if (flag) {\n std::cout << "YES";\n } else {\n std::cout << "NO" << std::endl;\n std::cout << a[0] << "." << a[1] << "." << a[2] << "." << a[3];\n }\n \n return 0;\n}\n
原文地址: https://www.cveoy.top/t/topic/p5Jw 著作权归作者所有。请勿转载和采集!