使用C++进行列对齐

Column Alignment using C++

本文关键字:对齐 C++ 使用      更新时间:2023-10-16

我正在努力让我的专栏与我的学校作业保持一致。说明是为了确保每个列标题与其各自的列正确对齐。到目前为止,我已经尝试了我在网上找到的所有内容,包括cout.width()和setw(),两者都不起作用。我希望这不是由于我错误地实现了这些方法,尽管我想不出它们不起作用的任何其他原因。该作业专门有 2 个学生姓名作为示例。琼斯,鲍勃和华盛顿,乔治。由于一个学生和下一个学生之间的字符数存在重大差异,因此列无法对齐。我知道设置列宽应该可以解决这个问题,但就我而言并非如此。然后我提供的代码使用 setw() 方法,但如果需要,我可以提供我尝试使用 cout.width() 的方式。任何帮助都非常感谢。

#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
using std::cout;
using std::cin;
using namespace std;
const int ARRAYSIZE = 2;
struct studentData{
string lastName;
string firstName;
float studentGpa;
}studentArray[ARRAYSIZE];
void displayData(int a);
int main()
{
int counter = 0;

for (int a = 0; a < ARRAYSIZE; a++)
{
cout << "Enter last name: " << endl;
cin >> studentArray[a].lastName;
cout << "Enter first name: " << endl;
cin >> studentArray[a].firstName;
cout << "Enter GPA: "<< endl;
cin >> studentArray[a].studentGpa;
counter++;
}
cout << "nn";
displayData(counter);
return 0;
}
void displayData(int a)
{
int newSize = a;
cout << left << setw(20) <<"nName(Last, First)";
cout << right << setw(20) << "GPAn";
for (int z = 0; z < newSize; z++)
{
cout << studentArray[z].lastName << ", " << studentArray[z].firstName;
cout << right << setw(20) << fixed << setprecision(2) <<studentArray[z].studentGpa << endl;
}
}

和我的控制台输入/输出:

Enter last name: 
Jones
Enter first name: 
Bob
Enter GPA: 
3.0
Enter last name: 
Washington
Enter first name: 
George
Enter GPA: 
4.0

Name(Last, First)                  GPA
Jones, Bob                3.00
Washington, George                4.00

您沿着正确的路线前进,但std::setw仅适用于下一个输出操作。如果您将打印名称转换为一个操作,而不是 3(最后一个、逗号、第一个),那么您可以更轻松地填充其宽度:

void displayData(std::size_t a)
{
std::cout << std::left
<< std::setw(20)
<< "Name(Last, First)"
<< "GPAn";
for (std::size_t z = 0; z < a; ++z)
{
std::cout << std::left
<< std::setw(20)
<< (studentArray[z].lastName + ", " + studentArray[z].firstName)
<< std::fixed << std::setprecision(2)
<< studentArray[z].studentGpa
<< 'n';
}
}

输出:

Name(Last, First)   GPA
Jones, Bob          3.00
Washington, George  4.00

在这里,无论是为了打印列标题还是对于学生姓名,我都使用std::left表示内容应该在填充总数的左侧,std::setw将此输出操作填充到总共 20 个字符(默认情况下它将用空格填充)。

在这两种情况下,这是输出中的第一列,所以我不需要对第二列执行任何操作。如果您有第 3 列,则还需要填充第 2 列。

我还用size_ts 替换了您的ints 以进行数组索引。这是一个小问题,但你不应该真正使用有符号类型来索引到容器中,其中访问负索引将是未定义的行为。


另外,请重新考虑您对通常被认为是不良做法的使用:using namespace std;endl(这些是解释的链接)。