我想将这些值硬编码到表中。当我尝试使用2D数组时,我遇到了处理字符和整数的问题。当我做一个结构时,到目前为止我有这个,但它不会在列中划分信息,我不知道如何格式化它。 (我开始只用了3行,如果让它们工作,剩下的就是一样了)
#include <iostream>
#include <string>
#include <iomanip>
using namespace std;
typedef struct table
{
std::string game;
int year;
float rating;
int num_voters;
}t;
void processTab(t*);
int main()
{
t tabl[2] = {0,0};
int i;
processTab(tabl);
for(i=0; i<2; i++)
{
std::cout << "Game: " << setw(20) << tabl[i].game;
std::cout << "\tYear: " << setw(4) << tabl[i].year;
std::cout << "\tRating: " << fixed << setprecision(2) << tabl[i].rating;
std::cout << "\tVoters: " << setw(6) << tabl[i].num_voters;
}
system("pause");
return 0;
}
void processTab(t*tab)
{
(tab[0].game, "twilight struggles");
tab[0].year = 2005;
tab[0].rating = 8.226;
tab[0].num_voters = 10690;
(tab[1].game, "Agricloa");
tab[1].year = 2007;
tab[1].rating = 8.17;
tab[1].num_voters = 23738;
(tab[2].game, "Puerto Rico");
tab[2].year = 2002;
tab[2].rating = 8.163;
tab[2].num_voters = 27433;
}
Table Data:
Game (0) Year (1) Rating (2) Num Voters (3)
Twilight Struggle 2005 8.226 10690
Agricola 2007 8.17 23738
Puerto Rico 2002 8.163 27433
Through the Ages 2006 8.153 8137
Power Grid 2004 8.02 21655
Le Havre 2008 7.972 9258
Eclipse 2011 7.968 3194
Brass 2007 7.911 5814
Dominion: Intrigue 2009 7.895 10889
Caylus 2005 7.878 13878
答案 0 :(得分:4)
我认为您正在寻找的是<iomanip>
#include <iomanip>
std::cout << "Game: " << setw(20) << tabl[i].game;
std::cout << "\tYear: " << setw(4) << tabl[i].year;
std::cout << "\tRating: " << fixed << setprecision(3) << tabl[i].rating;
std::cout << "\tVoters: " << setw(6) << tabl[i].num_voters;
std::cout << std::end;
注意:
setw
在写出东西时添加填充,因此它总是至少有一定的宽度
setprecision
指定要显示的小数位数
fixed
使浮点从不使用科学记数法
您的game
会员是一封信,您正在尝试为其分配一个字符串。不要在C ++中使用strcpy
,而是使用std::string
类。
#include <string>
struct table
{
std::string game;
int year;
double rating;
int num_voters;
};
避免使用using namespace std;
,当你遇到包含许多名称空间的复杂代码时,为避免混淆,这几个字母的代价很小。
避免使用endl
:它会刷新缓慢的缓冲区。如果您只想换行,请使用'\n'
此外,您可以使用新的初始化语法来初始化列表:
std::vector<table> tbal = {
{"twilight struggles ", 2005, 8.226, 10690},
{"Agricola ", 2007, 8.17 , 23738},
{"Puerto Rico ", 2002, 8.163, 27433}
};
答案 1 :(得分:2)
简短回答:使用std::vector
,而不是原始数组。
以下内容与原始代码尽可能接近,为您介绍最少数量的新功能:
#include <assert.h> // assert
#include <iostream> // std::cout, std::endl
#include <stddef.h> // ptrdiff_t
#include <string> // std::string
#include <utility> // std::begin, std::end
#include <vector> // std::vector
using namespace std;
typedef ptrdiff_t Size;
template< class Container >
Size countOf( Container& c ) { return end( c ) - begin( c ); }
struct Game
{
string game;
int year;
double rating;
int num_voters;
};
void initialize( vector<Game>& games )
{
assert( countOf( games ) == 0 );
games.resize( 3 );
games[0].game = "twilight struggles";
games[0].year = 2005;
games[0].rating = 8.226;
games[0].num_voters = 10690;
games[1].game = "Agricloa";
games[1].year = 2007;
games[1].rating = 8.17;
games[1].num_voters = 23738;
games[2].game = "Puerto Rico";
games[2].year = 2002;
games[2].rating = 8.163;
games[2].num_voters = 27433;
}
int main()
{
vector<Game> games;
initialize( games );
for( int i = 0; i < countOf( games ); ++i )
{
cout << i << endl;
cout <<"\tGame: " << games[i].game << endl;
cout<<"\tYear: " << games[i].year << endl;
cout<<"\trating: " << games[i].rating << endl;
cout<<"\tnum voters: " << games[i].num_voters << endl;
}
}
有一些方法可以更直接地声明数据,包括大括号初始化器;看看你的C ++教科书。
答案 2 :(得分:1)
首先,您需要正确定义table
(顺便说一句struct
的错误名称)。您尝试使用game
来存储字符串,但只将其定义为单个char
。您可能希望将其更改为std::string
。
然后,您可能希望在operator<<
重载中进行格式化,以引用table
作为类型。 @MooingDuck已经很好地介绍了格式本身,所以这主要取决于你如何打包它:
std::ostream &operator<<(std::ostream &os, table const &t) {
os << "Game: " << setw(20) << t.game;
os << "\tYear: " << setw(4) << t.year;
os << "\tRating: " << fixed << setprecision(2) << t.rating;
return os << "\tVoters: " << setw(6) << t.num_voters;
}
除此之外,您几乎肯定希望将tabl
从数组更改为std::vector<table>
:
std::vector<tabl> tabl;
然后处理表变为:
std::copy(tabl.begin(), tabl.end(), std::ostream_iterator<table>(std::cout, "\n"));
另一个小细节:你似乎有两个完全不同/独立的函数,都被命名为processTab
。您可能想要至少重命名其中一个。只是看了看他们,我可能会在那个订单上打一个initializeTable
或者其他东西。