字符串比较的C++IP地址



我的任务是比较给定数量的IP地址。Firs,我必须向用户询问数量,然后用户必须键入那么多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 << "nn";

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 = &empty;
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;
}

确保项目;如果它是前一个的副本,则不会被打印多次,因为我们将该状态保存在intermidiatevar.中

这就是最终产品的样子

#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 = &empty;
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
}
}

标准库中的排序算法和相邻查找算法将为您完成繁重的工作。

相关内容

  • 没有找到相关文章

最新更新