【问题标题】:Printing elements of a tuple打印元组的元素
【发布时间】:2018-04-28 19:45:04
【问题描述】:

我正在尝试打印一个函数返回的元组的元素,在该函数中我将地址向量的元素与数据库中的元素进行比较。字段分别为: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

我想我可以编写另一个函数,之后将换行符格式化为正确的格式,但我很好奇是什么原因造成的。有什么想法吗?

【问题讨论】:

  • 你为什么不直接把它打印到cout 没有那些临时字符串?
  • 对不起,那只是我在 cout
  • 可能来自entry的字符串包含一些垃圾?
  • 我觉得情况并非如此,因为当我打印用换行符分隔的所有内容时。我将每个字符串文字更改为换行符,并且元素输出正确。对正在发生的事情没有想法。
  • 但是你有没有通过直接检查字符串内容来检查?

标签: c++ cout stdtuple


【解决方案1】:

您能否提供更多代码,以便对其进行调试以精确跟踪问题?

我认为tupleget 使用正确。

我猜问题出在字符串的内容中,或者至少在 `get(entry) 返回的字符串中。

这是一个小例子,它显示了可能出现的问题

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&lt;X&gt; 返回的字符串是否不包含任何特殊字符或包含 OSX 行尾与 Linux 或 Windows 行尾混合

【讨论】:

    猜你喜欢
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 2013-09-12
    • 2019-07-22
    相关资源
    最近更新 更多