Печатные элементы кортежа - PullRequest
0 голосов
/ 28 апреля 2018

Я пытаюсь распечатать элементы кортежа, возвращаемого функцией, где я сравниваю элементы вектора адресов с теми, что в базе данных. Поля: 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;
}

Я хочу, чтобы каждая строка вывода выглядела так: "{префикс} / {# бит префикса} {ASN} {адрес} \ 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

Я полагаю, что я мог бы просто написать другую функцию, которая форматирует разрывы строк в правильный формат после этого, но мне любопытно, что является причиной этого. Есть идеи?

1 Ответ

0 голосов
/ 29 апреля 2018

Не могли бы вы предоставить немного больше кода, чтобы его можно было отладить для точного отслеживания проблемы?

Я думаю, tuple и get используются правильно.

Полагаю, проблема в содержимом строк или, по крайней мере, в строке, возвращаемой `get <2> (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<X>, не содержит специальных символов или содержит конец строки OSX, смешанный с концом строки Linux или Windows

...