Как выровнять вывод? - PullRequest
       23

Как выровнять вывод?

0 голосов
/ 19 мая 2019

Как выровнять вывод?

Я попробовал это

  for(int x = 0; i<5; i++)
  cout<<a[x]<<setw(5)<<"|"<<setw(5)<<b[x]<<endl;

Если все имеют одинаковую длину символа, то вывод будет такой

 frd     |     hehe
 asd   |     hoho
 .....
 .....

Ноесли не имеют одинаковую длину

 frd     |     hehe
 asdfg     |     hohoo

Как это решить?

Ответы [ 3 ]

1 голос
/ 19 мая 2019

Вы можете изменить setw (#) на любое нужное вам число.

#include<iostream>
#include<iomanip>
#include<string>
using namespace std;

int main()
{
    string a[5] = {"afdfadsf","ggrggeee","fdsafsda","erererefdsfd","sdfdsfdffdf"};
    string b[5] = {"fdsfdsfd", "fdsfdsaffdf","fdsfsadfdfd","rererrefdfd","zzzzzzzfdfd"};
    for(int i = 0; i<5; i++)
        cout << left << setw(15) << a[i] << left << setw(15) << b[i] <<  endl;
}
1 голос
/ 19 мая 2019

В предложенном вами коде:

    cout<<a[x]<<setw(5)<<"|"<<setw(5)<<b[x]<<endl;

у вас есть две проблемы, которые приводят к смещению. (1) вы не указали ширину a[x], поэтому она будет выводиться без каких-либо настроек; и (2) в зависимости от искомого выравнивания, выравнивание по умолчанию, если ширина указана для std::cout, будет right выравнивание.

(кроме того, как отмечалось в моем комментарии, в вашем первом примере a[0] и a[1] не могут иметь одинаковую длину, как показано в примере. Там "frd " сохраняется с дополнительными whitespace (или "asd\b" хранится со встроенным backspace) в противном случае выходные данные "a[x]|" будут выровнены.)

Чтобы обеспечить выравнивание для выходных данных a и b, необходимо указать, как минимум, ширину a[x] с помощью std::setw(n). Кроме того, если вы не хотите выровнять a[x] справа от поля, созданного std::setw(5), вы должны управлять выравниванием, установив std :: ios_base :: fmtflags с помощью std::setiosflags(std::ios_base::left) (или просто * 1027). *). См. std :: setiosflags .

Когда вы устанавливаете флаг формата для потока, вы устанавливаете биты в типе Bitmap , который останется установленным после завершения текущего вызова std::cout. Таким образом, чтобы привести себя в порядок и восстановить состояние флага потока по умолчанию, вы либо (1) должны сохранить fmtflags для потока, захватив все флаги с помощью std::ios_base::fmtflags, либо (2) вы должны сбросить отдельное лицо флаг, установленный с помощью std::resetiosflags(...).

Поэтому, если я понимаю ваш вопрос и ваш запрос на выравнивание (хотя неясно, как вы хотите выровнять b[x]), вы можете выровнять и a, и b с выравниванием по левому краю с помощью:

    std::cout << "left justified output (both a & b)\n\n";
    for (size_t i = 0; i < a.size(); i++)
        std::cout << std::left  << std::setw(5) 
                << a[i] << " | " << b[i] << '\n';

или вы можете выровнять a с выравниванием по левому краю и затем восстановить состояние флага по умолчанию, позволяя выводить b с выравниванием по умолчанию (по правому краю), например,

    std::cout << "\nleft justified output for a, default for b\n\n";
    for (size_t i = 0; i < a.size(); i++)
        std::cout << std::left  << std::setw(5) 
                << a[i] << " | " << std::resetiosflags(std::ios_base::left) 
                << std::setw(5) << b[i] << '\n';

Сложив это в пример, вы можете сделать:

#include <iostream>
#include <iomanip>
#include <vector>
#include <string>

int main (void) {

    std::vector<std::string> a = { "frd", "asdfg", "asd", "quack" }, 
                             b = { "hehe", "hohoo", "haloo", "hack" };

    std::cout << "left justified output (both a & b)\n\n";
    for (size_t i = 0; i < a.size(); i++)
        std::cout << std::left  << std::setw(5) 
                << a[i] << " | " << b[i] << '\n';

    std::cout << "\nleft justified output for a, default for b\n\n";
    for (size_t i = 0; i < a.size(); i++)
        std::cout << std::left  << std::setw(5) 
                << a[i] << " | " << std::resetiosflags(std::ios_base::left) 
                << std::setw(5) << b[i] << '\n';
}

Пример использования / вывода

$ ./bin/setwstring
left justified output (both a & b)

frd   | hehe
asdfg | hohoo
asd   | haloo
quack | hack

left justified output for a, default for b

frd   |  hehe
asdfg | hohoo
asd   | haloo
quack |  hack

Примечание: Если вы хотите внести несколько изменений в флаги в ходе операции вывода, а затем восстановить ВСЕ флаги формата в исходное состояние, вы можете использовать:

    std::ios_base::fmtflags f = std::cout.flags (); // save ios_base flags
    // do output, set flags as desired
    std::cout.flags (f);                            // restore saved flags

Дайте мне знать, если это касается выравнивания, которого вы пытались достичь.

0 голосов
/ 19 мая 2019

Попробуйте использовать printf. Серьезно, это работает.

например:

#include <cstdio>
int main() {
    printf("%-10s | %10s\n", "asd", "asdad");
    printf("%-10s | %10s\n", "asd", "adad");
    printf("%-10s | %10s\n", "adsada", "adad");
    printf("%-10s | %10s\n", "addasda", "adad");
    printf("%-10s | %10s\n", "asdsd", "dad");
    printf("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\n", "asdsd", "dad");
    printf("%-10s | %-10s\n", "asd", "asdad");
    printf("%-10s | %-10s\n", "asd", "adad");
    printf("%-10s | %-10s\n", "adsada", "adad");
    printf("%-10s | %-10s\n", "addasda", "adad");
    printf("%-10s | %-10s\n", "asdsd", "dad");
}

Дает

asd        |      asdad
asd        |       adad
adsada     |       adad
addasda    |       adad
asdsd      |        dad
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
asd        | asdad     
asd        | adad      
adsada     | adad      
addasda    | adad      
asdsd      | dad    
...