首页 > 解决方案 > C++:无法打印按预期格式化的文本

问题描述

我正在尝试打印此 LIST,但它让我发疯了。

所以这是我想要得到的输出:

Veranstaltungen:
1: Freitag     08:00 - 09:30   SU Informatik III     Kevin Kaufmann  H3
2: Freitag     10:00 - 11:30   Ueb Informatik III    Kevin Kaufmann  D 114
3: Freitag     12:15 - 13:45   Ueb Informatik III    Kevin Kaufmann  D 114
4: Montag      10:00 - 11:30   SU Mathe III          Nathan Neuling  B 301
5: Mittwoch    10:00 - 11:30   Ueb Mathe III         Nathan Neuling  D 209
6: Donnerstag  16:00 - 17:30   Englisch              Sabine Sauber   D 419
7: Dienstag    16:00 - 17:30   SU Digitale Systeme   Willi Witzig    H5
8: Dienstag    17:45 - 19:15   Ueb Digitale Systeme  Willi Witzig    D 114

这是我的代码中的打印功能:

我首先在这里尝试了这个简单的替代方案:

void CEvents::print()
    {
      cout << "Veranstaltungen:" << endl ;
    
      for (int i = 0 ; i < counter;i++)
      {
        CWeekday Day = Events[i]->WeekDay;
        cout<<i+1<<": "<<Events[i]->getDay(Day) << "        ";
        Events[i]->Block->print();
        cout<<"     "<<Events[i]->Name<<"     "<<Events[i]->Teacher->Name<<"     "<<Events[i]->Room->Name<< endl;
      }
    
    
    }

我从这段代码中得到了这个输出:

Veranstaltungen:
1: Freitag        08:00 - 09:30     SU Informatik III      Kevin Kaufmann     H3
2: Freitag        10:00 - 11:30     Ueb Informatik III      Kevin Kaufmann     D 114
3: Freitag        12:15 - 13:45     Ueb Informatik III      Kevin Kaufmann     D 114
4: Montag        10:00 - 11:30     SU Mathe III      Nathan Neuling     B 301
5: Mittwoch        10:00 - 11:30     Ueb Mathe III      Nathan Neuling     D 209
6: Donnerstag        16:00 - 17:30     Englisch      Sabine Sauber      D 419
7: Dienstag        16:00 - 17:30     SU Digitale Systeme      Willi Witzig      H5
8: Dienstag        17:45 - 19:15     Ueb Digitale Systeme     Willi Witzig      D 114

当然这个不能正常工作,因为它们都没有相同的长度,但至少这里的第一部分是正确的。

然后我尝试切换到 printf() 而不是 cout ,离结果更近了一点,但仍然不一样:

extern "C" void CEvents::print()
{
  cout << "Veranstaltungen:" << endl ;
  string a= " ";
  for (int i = 0 ; i < counter;i++)
  {
    CWeekday Day = Events[i]->WeekDay;
    printf("%d: %10s %5s",i+1,Events[i]->getDay(Day).c_str(),a.c_str());
    Events[i]->Block->print(); 
    printf("%30s %20s %10s\n",Events[i]->Name.c_str(),Events[i]->Teacher->Name.c_str(),Events[i]->Room->Name.c_str());
   }

}

对于这段代码,我得到了这个输出:

1:    Freitag      08:00 - 09:30            SU Informatik III        Kevin Kaufmann        H3
2:    Freitag      10:00 - 11:30           Ueb Informatik III        Kevin Kaufmann      D 114
3:    Freitag      12:15 - 13:45           Ueb Informatik III        Kevin Kaufmann      D 114
4:     Montag      10:00 - 11:30                 SU Mathe III        Nathan Neuling      B 301
5:   Mittwoch      10:00 - 11:30                Ueb Mathe III        Nathan Neuling      D 209
6: Donnerstag      16:00 - 17:30                     Englisch        Sabine Sauber       D 419
7:   Dienstag      16:00 - 17:30          SU Digitale Systeme         Willi Witzig         H5
8:   Dienstag      17:45 - 19:15          Ueb Digitale Systeme        Willi Witzig       D 114

现在第二部分是正确的(时间),而其他部分不是。如何正确制作这种格式?

标签: c++

解决方案


使用std::leftandstd::setw应该可以得到你想要的格式。

由于您没有提供完整的示例,因此我不得不即兴发挥一点,但您应该能够将此代码改编为您的代码:

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

int main()
{
    std::vector<std::array<std::string, 5>> data =
    {
        { "Freitag", "08:00 - 09:30", "SU Informatik III", "Kevin Kaufmann", "H3" },
        { "Freitag", "10:00 - 11:30", "Ueb Informatik III", "Kevin Kaufmann", "D 114" },
        { "Freitag", "12:15 - 13:45", "Ueb Informatik III", "Kevin Kaufmann", "D 114" },
        { "Montag", "10:00 - 11:30", "SU Mathe III", "Nathan Neuling", "B 301" },
        { "Mittwoch", "10:00 - 11:30", "Ueb Mathe III", "Nathan Neuling", "D 209" },
        { "Donnerstag", "16:00 - 17:30", "Englisch", "Sabine Sauber", "D 419" },
        { "Dienstag", "16:00 - 17:30", "SU Digitale Systeme", "Willi Witzig", "H5" },
        { "Dienstag", "17:45 - 19:15", "Ueb Digitale Systeme", "Willi Witzig", "D 114" },
    };
    std::cout << "Veranstaltungen:\n";
    for (size_t i = 0; i < data.size(); i++)
    {
        std::cout << (i+1) << ": " <<
            std::left <<
            std::setw(12) << data[i][0] <<
            std::setw(16) << data[i][1] <<
            std::setw(22) << data[i][2] <<
            std::setw(16) << data[i][3] <<
            data[i][4] << "\n";
    }
}

https://godbolt.org/z/EqafWs


推荐阅读