如何解决C++ IP 地址作为字符串比较?
我的任务是比较给定数量的 IP 地址。首先,我必须向用户询问数量编号,然后用户必须输入那么多IP。在那之后,我必须比较它们——如果我发现一个不止一次出现,我必须把它写出来。
我的问题是我不知道如何在没有我的双 for() 循环多次写出它们的情况下写出它们。你能帮我一下吗,我应该纠正什么?
#include<iostream>
#include<string>
int main(){
int n;
std::cin >> n;
std::string ips[n];
for(int i = 0; i < n; i++){
std::cin >> ips[i];
}
std::cout << "\n\n";
for(int i = 0; i < n-1; i++){
for(int j = i+1; j < n; j++){
if(ips[i] == ips[j]){
std::cout << ips[j] << '\n';
}
}
}
return 0;
}
解决方法
既然你提到你是初学者,我假设 IP 地址的使用只是为了说明目的,你使用的资源不希望你关心处理 IP 卫生,比如清理前导零,等
如果确实如此,您正在寻找的是一种检查用户输入字符串列表中重复项的方法,以及一种仅打印重复项而忽略重复项的方法。
所以首先,而不是这个
std::string ips[n];
让我们简单地使用一个向量
int n;
std::cout << "Enter number of IP addresses" << '\n';
std::cin >> n;
std::vector<std::string> ip_addresses;
for (int i = 0; i < n; i++)
{
std::string ip;
std::cin >> ip;
ip_addresses.push_back(ip);
}
此处 ip_addresses
保存用户提供的任何内容(请记住,此方法不会授予用户输入的实际 IP 地址,我将验证留给您。)
接下来你需要弄清楚这些重复是什么。
有几种方法可以做到这一点,您可以使用 STL
算法库函数,例如 std::adjacent_find
但这现在可能太先进了,您可以对向量进行排序并检查相邻的重复项简单点
std::sort(ip_addresses.begin(),ip_addresses.end());
这将对ip_addresses
的向量进行排序
和这段代码
const std::string empty{ "" };
const std::string* prev = ∅
const std::string* intermidiate;
for (const std::string& s : ip_addresses)
{
if (*prev == s && *prev != *intermidiate)
{
std::cout << "Found duplicate entries for: " << s << '\n';
intermidiate = &s;
}
prev = &s;
}
确保项目;如果它与之前的某个重复,则不会多次打印,因为我们将该状态保留在 intermidiate
变量中。
这就是最终产品的样子
#include <iostream>
#include <string>
#include <vector>
int main()
{
int n;
std::cout << "Enter number of IP addresses" << '\n';
std::cin >> n;
std::vector<std::string> ip_addresses;
for (int i = 0; i < n; i++)
{
std::string ip;
std::cin >> ip;
ip_addresses.push_back(ip);
}
std::sort(ip_addresses.begin(),ip_addresses.end());
const std::string empty{ "" };
const std::string* prev = ∅
const std::string* intermidiate;
for (const std::string& s : ip_addresses)
{
if (*prev == s && *prev != *intermidiate)
{
std::cout << "Found duplicate entries for: " << s << '\n';
intermidiate = &s;
}
prev = &s;
}
return 0;
}
这是一个测试用例
Enter number of IP addresses
6
192.168.0.1
192.118.28.2
192.168.0.1
192.180.0.2
192.180.0.2
23.45.199.2
Found duplicate entries for: 192.168.0.1
Found duplicate entries for: 192.180.0.2
,
上面的其他人指出您不能执行以下操作:
std::string ips[n];
相反,做这样的事情会更接近你想要的:
std::vector<std::string> ips;
int n;
std::cin >> n;
for(int i = 0; i < n; ++i)
{
std::string str;
std::cin >> str;
ips.push_back(str);
}
std::sort(ips.begin(),ips.end());
auto iter = ips.begin();
while (iter != ips.end())
{
iter = std::adjacent_find(iter,ips.end());
if(iter != ips.end())
{
std::cout << *iter << '\n';
iter += 2; // To skip this place and the next
}
}
标准库中的 sort 算法和 adjacent find 算法将为您完成繁重的工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。