问题:Su_Zipei 家的 IP 地址出了点小状况电脑中记录的 IP 地址可能是一个非法的地址这使得他无法上网你需要帮他修正 IP 地址使得 IP 地址合法。具体的给出一个字符串表示 IP 地址如果原串合法则直接输出 YES否则先输出一个 NO再从新的一行中输出改正完的地址修改规则如下:1如果有数字大于 255修改为 255;2如果有多余的字符请去掉还原成 XYZK 的形式其中XYZK为不超过
问题:
- 代码中使用了
#include<bits/stdc++.h>这样的头文件,这是非标准的写法,不建议使用。应该根据实际需要引入相应的头文件,例如#include<iostream>和#include<string>。 - 使用
using namespace std;会导致命名空间污染,不建议使用。可以使用std::前缀来指定命名空间,例如std::string和std::cout。 - 在循环中使用
s.length()作为循环的条件,这样每次循环都会重新计算字符串的长度,效率较低。应该在循环外将字符串的长度保存到一个变量中,然后在循环中使用该变量。 - 在判断字符是否为数字时,使用了
if (s[i]>='1'&&s[i]<='9'),这样只能判断字符是否为1到9之间的数字,不能判断0是否为数字。应该使用if (s[i]>='0'&&s[i]<='9')来判断字符是否为数字。 - 在判断字符是否为多余的字符时,使用了
if (s[i]!='.'||s[i]!='0'&&s[i]!='.'),这样的逻辑是错误的。应该使用if (s[i]!='.' && s[i]!='0')来判断字符是否为多余的字符。 - 在判断是否有四个整数时,使用了
if (cnt!=4) a[3]=temp;,这样的逻辑是错误的。应该使用if (cnt!=3) flag=false;来判断是否有四个整数。 - 在输出修正后的地址时,使用了
printf("%d.%d.%d.%d",a[0],a[1],a[2],a[3]);,这是C语言的写法,不适用于C++。应该使用std::cout来输出。 - 缺少对输入合法性的检查,例如输入的字符串是否为空,是否包含非法字符等。
修改后的代码如下:
#include <iostream>
#include <string>
int main() {
std::string s;
std::cin >> s;
bool flag = true;
int a[4], temp = 0, cnt = 0;
for (int i = 0; i < s.length(); i++) {
if (s[i] >= '0' && s[i] <= '9') {
temp = temp * 10 + (s[i] - '0');
} else {
if (s[i] != '.' && s[i] != '0') {
flag = false;
}
if (temp) {
a[cnt] = temp;
temp = 0;
cnt++;
}
}
}
if (cnt != 3) {
flag = false;
}
a[3] = temp;
for (int i = 0; i < 4; i++) {
if (a[i] > 255) {
flag = false;
a[i] = 255;
}
}
if (flag) {
std::cout << "YES";
} else {
std::cout << "NO" << std::endl;
std::cout << a[0] << "." << a[1] << "." << a[2] << "." << a[3];
}
return 0;
}
``
原文地址: http://www.cveoy.top/t/topic/inMg 著作权归作者所有。请勿转载和采集!