我正在尝试打印由函数返回的元组的元素,其中我将地址向量的元素与数据库中的元素进行比较。字段为:32位int表示地址,int表示前缀匹配,字符串包含ASN,字符串包含匹配地址,字符串包含要查询的原始地址。
for (auto itr = IPs.begin(); itr != IPs.end(); itr++) {
tuple<int,int,string,string,string> entry = Compare(*itr, database);
string out = get<3>(entry) + "/" + to_string(get<1>(entry)) + " " + get<2>(entry) + " " + get<4>(entry) + "\n";
cout << out;
}
我希望输出的每一行看起来像这样: “{prefix} / {#bits of prefix} {ASN} {address} \ n” 但是,输出看起来像这样:
12.105.69.1528 15314
12.125.142.190 6402
57.0.208.2450 6085
208.148.84.30 4293
208.148.84.16 4293
208.152.160.797 5003
192.65.205.2509 5400
194.191.154.806 2686
199.14.71.79 1239
199.14.70.79 1239
预期输出为:
12.105.69.144/28 15314 12.105.69.152
12.125.142.16/30 6402 12.125.142.19
57.0.208.244/30 6085 57.0.208.245
208.148.84.0/30 4293 208.148.84.3
208.148.84.0/24 4293 208.148.84.16
208.152.160.64/27 5003 208.152.160.79
192.65.205.248/29 5400 192.65.205.250
194.191.154.64/26 2686 194.191.154.80
199.14.71.0/24 1239 199.14.71.79
199.14.70.0/24 1239 199.14.70.79
最令我困惑的部分是,当我通过用换行符替换每个分隔符在单独的行上打印每个元素时,它会正确打印元素:
12.105.69.144
28
15314
12.105.69.152
12.125.142.16
30
6402
12.125.142.19
57.0.208.244
30
6085
57.0.208.245
208.148.84.0
30
4293
208.148.84.3
208.148.84.0
24
4293
208.148.84.16
208.152.160.64
27
5003
208.152.160.79
192.65.205.248
29
5400
192.65.205.250
194.191.154.64
26
2686
194.191.154.80
199.14.71.0
24
1239
199.14.71.79
199.14.70.0
24
1239
199.14.70.79
我想我可以编写另一个函数,然后将换行符格式化为正确的格式,但我很好奇导致这种情况的原因。有什么想法吗?
答案 0 :(得分:0)
您能提供更多代码吗?可以调试它来精确跟踪问题吗?
我认为tuple
和get
使用正确。
我想问题出现在字符串的内容中,或者至少在`get&lt; 2&gt;(条目)返回的字符串中。
这是一个显示可能出错的小例子
std::string aa = "AAAAA\r"; //"\r" is extra character in aa string
std::string bb = "bbb";
std::cout << aa + " " + bb; //output is " bbbA" not "AAAAA bbb"
当每行中的每个字符串分别打印时,问题显然不会发生。
仔细检查get<X>
返回的字符串是否包含任何特殊字符或包含与Linux或Windows行尾混合的OSX行结尾