/*
收获:
1. 我觉得最大的收获是,了解了该怎么进行竖向的数据输出
并且,以及《入门经典》的做法,并没有先转换为二维数组再输出,而是用了些别的技巧(好像也能算是技巧,具体的看代码吧,这个我也不太好描述)
2. string的size()函数的返回类型:
之前一直以为是int型,后来看到《入门经典》里面有对size返回值的强制类型转换,于是去查了一下,发现自己以前错得有些离谱啊!~
引用博客的总结:
那么size()这个函数返回的类型到底是什么呢?一定要记住,绝对不是整形,而是size_type类型的,所以千万不要把size的返回值赋给一个int变量
有关这个知识点的blog;
http://blog.csdn.net/sanshixia/article/details/12259527
此外,在C++ Primer 中文版的第四版,有说明如下:
任何存储string的size操作结果的变量必须为 string::size_type类型,特别重要的是,不要把size的返回值赋给一个int变量
另外,上面的blog里面还有这样一段话:
string::size_type从本质上来说,是一个整型数。关键是由于机器的环境,它的长度有可能不同。 例如:我们在使用 string::find的函数的时候,它返回的类型就是 string::size_type类型。而当find找不到所要找的字符的时候,它返回的是 npos的值,这个值是与size_type相关的。假如,你是用 string s; int rc = s.find(.....); 然后判断,if ( rc == string::npos ) 这样在不同的机器平台上表现就不一样了。如果,你的平台的string::size_type的长度正好和int相匹配,那么这个判断会侥幸正确。但换成另外的平台,有可能 string::size_type的类型是64位长度的,那么判断就完全不正确了。 所以,正确的应该是: string::size_type rc = s.find(.....); 这个时候使用 if ( rc == string::npos )就会正确了。
概括一下段意就是:
size的返回值会和所用机器有关,所以有时的正确只是侥幸正确
所以如果要将size_type类型的数据,和另一个已知类型的数据进行比较
要么强制转换 size_type为特定类型
要么将已知类型转换为 string::size_type 类型
3. 传引用 与 传const类引用
最初将 void print(const string& s, int len, char ch) 误写为了
void print(string& s, int len, char ch)
结果程序报错了,后来找到了两个解释:
https://stackoverflow.com/questions/14492158/invalid-initialization-of-non-const-reference-of-type-stdstring
http://blog.csdn.net/zhenwo123/article/details/8031155
*/
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
const int maxcol = 60;
const int maxn = 105;
string filenames[maxn];
// 输出字符串s,长度不足 len 时补字符 ch
void print(const string& s, int len, char ch)
{
cout << s;
for (int i = 0; i < len - s.size(); i++)
cout << ch;
}
int main()
{
int n;
while (cin >> n)
{
int M = 0; //M为长度最长文件名的长度
for (int i = 0; i < n; i++)
{
cin >> filenames[i];
M = max(M, (int)filenames[i].size()); //注意,string的size函数的返回值,一定要加上强制类型转换
}
//计算列数cols和行数rows
int cols = (maxcol - M) / (M + 2) + 1, rows = (n - 1) / cols + 1;
print("", 60, '-');
cout << endl;
sort(filenames, filenames + n); //排序
for (int r = 0; r < rows; r++)
{
for (int c = 0; c < cols; c++)
{
int idx = c * rows + r;
if (idx < n) print(filenames[idx], c == cols - 1 ? M : M + 2, ' ');
}
cout << endl;
}
}
return 0;
}