• UVA


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


  • 相关阅读:
    Python 读取二进制、HTML 、XML 格式存储的 Excel 文件
    ios自动将长数字(7位)转成电话号码
    前端常见手撕源码
    在微信里及QQ浏览器里ios短信回填vue方法取不到值,去除黄色背景
    js添加css到head中
    WEB 基础认证(BasicAuth)
    Word如何插入PDF格式矢量图片
    【解决】MATLAB中报错:无法将双精度值 0.0401495 转换为句柄
    【解决】Word中插入图片后变模糊
    使用SuperSocket开发联网斗地主(三):抢地主
  • 原文地址:https://www.cnblogs.com/mofushaohua/p/7789440.html
Copyright © 2020-2023  润新知