#include <iomanip>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<string>
#include<iostream>
#include<vector>
#include<sstream>
#include<algorithm>
using namespace std;
vector<string>Vstr[1024];
int C[1024];
int Max[200];
int main()
{
//freopen("in.txt","r",stdin);
int c=0, r=0,num=0,re;
int q=0;
string s;
string word;
fill_n(Max,300,0);
while(getline(cin,s)){ //注意,getline会将开头或者结尾的"\n"符读入,办法是将条件s[0]!='\0'加入
c=0;
stringstream ss(s);
while(ss>>word){
if(word.size()>Max[c]) Max[c]=word.size();
c++;
Vstr[r].push_back(word);
}
C[r]=c;
r++;
}
for(int i = 0 ; i<r ; i++){
for(int j = 0 ; j<C[i] ; j++){
if( j!=Vstr[i].size()-1){
cout<<left<<setfill(' ')<<setw(Max[j]+1)<<Vstr[i][j];
}else{
cout<<left<<Vstr[i][j]<<"\n";
}
}
}
return 0;
}
此道题耗时巨大,在整个编写与测试的过程中出现了很多的问题,现在一一列出,作为此道题的收获,希望自己能够在
算法运行与测试的路途中不忘初心,砥砺前行。
1. 一开始纠结于用string二维数组比较方便,还是使用vector数组比较方便,最后还在这个问题上反复更正了几回
2. 编写到第一次代码快要结束的时候发现问题,如果不知道行列数,那么寻找每列字符串的最大值和输出字符串会
特别麻烦。
a. 在两个for循环中添加的就会是最大行数和最大列数,且会要增加一系列判断条件所用的变量,增大出错的几率
b. 寻找Max的过程中发现,数组的大小默认返回值为无符号型,int 型为有符号类型,这两个在比较时系统会自动将
有符号类型转换为无符号类型,而-1转变为无符号整型后结果为最大的int型。
3. 后来想到可以在输入数据的过程中,就将行数和列数记录下来,再利用for循环的方式。但是没有通过成功(因为
其实我的代码中一直有个bug没发现)
4. 最后看了书,才猛然发觉,原来在输入字符串的时候也能够一并将每列最长的字符串的大小求出。于是手写代码
但是仍然没有AC,提交一直显示runtime error
5. 后来自己写了个编写测试代码的程序,将输入放入txt,再用测试数据去尝试,结果发现每次到了600多行的时候
代码就会自行中断。并且对于任何一段随机的字符串都是这样。
6. 最终发现问题所在:我一直存储的每一行的列数开得数组太小(惊喜不惊喜,意外不意外?发现这个错误我都想k
我自己,不过在查找的过程中一直都是自己动手在做,所以虽然用时很长,但收获颇多)
知识点:
1. size_t是一种无符号的整型数,它的取值没有负数,在数组中也用不到负数,而它的取值范围是整型数的双倍。
sizeof操作符的结果类型是size_t,它在头文件中typedef为unsigned int类型。该类型保证能容纳实现所建立
的最大对象的字节大小。
2. fill_n函数的作用是:给你一个起始点,然后再给你一个数值count和val。把从起始点开始依次赋予count个元素val的值。
注意: 不能在没有元素的空容器上调用fill_n函数
例: fill_n(*start,count,paint)。表示从start开始连续填充count个数字,paint为填充的数值。
3. 当使用.size() 或者 .length() 函数时一般返回一个unsigned int , 当无符号整数与int 整数相比较的时候
系统会自动把int 整数转换为无符号整数,而负数转换为unsigned int时,例如-1——>最大的双倍int整数,
所以比较会出错
4. 当需要对很多行字符串进行操作的时候,一定要记住,没有行和列,很难操作,一定要想办法知道他们的行和列
并且在输入的时候可以的到很多在题目中会要用到的值。