使用C++进行列对齐
Column Alignment using C++
我正在努力让我的专栏与我的学校作业保持一致。说明是为了确保每个列标题与其各自的列正确对齐。到目前为止,我已经尝试了我在网上找到的所有内容,包括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_t
s 替换了您的int
s 以进行数组索引。这是一个小问题,但你不应该真正使用有符号类型来索引到容器中,其中访问负索引将是未定义的行为。
另外,请重新考虑您对通常被认为是不良做法的使用:using namespace std;
和endl
(这些是解释的链接)。
相关文章:
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 如何创建一个QTableWidgetItem,用长文本右对齐,左边有省略号
- 我可以检测和更改 gcc/g++ 中结构的当前数据对齐设置吗?
- 64位机器上的C++内存对齐
- 为什么我可以将变量存储在不是其最小对齐方式的倍数的地址?
- 使 std::vector 分配对齐内存的现代方法
- C++ cout 将双精度对齐到精度 2 并正确对齐
- 在 64 位边界上对齐C++结构数组?
- 使用 g++7 构建的代码在访问未对齐的内存时崩溃
- 在 capnp FlatArrayMessageReader 的对齐内存缓冲区中接收 zmq 消息
- 是否值得对齐变量?
- 初始化派生结构的基部分/意外打包派生结构字段以对齐基结构的间隙
- 对齐和对齐的实际用例C++关键字
- 如何减少代码的运行时间以对齐文本?
- 指向包含对齐 C 结构C++类的 C 指针的对齐问题
- Linux C++ 中的页面对齐内存分配
- C++ 类层次结构中的"对齐"是什么意思?
- 运行时错误:引用绑定到类型"int"的未对齐地址0xbebebebebebebec6,这需要 4 个字节对齐 (stl_vector.h)
- 具有调整对齐方式的类型定义
- 对于堆上的页面对齐内存分配是否有任何优化或不同的 API?