/* 收获: 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; }