结构体的使用

来源:互联网 发布:韩国网络电视成人直播 编辑:程序博客网 时间:2024/05/18 03:45

开发一个简单错误记录功能小模块,能够记录出错的代码所在的文件名称和行号。 
处理:
1.记录最多8条错误记录,对相同的错误记录(即文件名称和行号完全匹配)只记录一条,错误计数增加;(文件所在的目录不同,文件名和行号相同也要合并)
2.超过16个字符的文件名称,只记录文件的最后有效16个字符;(如果文件名不同,而只是文件名的后16个字符和行号相同,也不要合并)

3.输入的文件可能带路径,记录文件名称不能带路径


#include<iostream>#include<string>#include<algorithm> using namespace std; struct Record {//这里声明了一个记录的结构体,其中有三项 文件名,错误行号及错误数目    string filename;    int column;    int count;};Record rec[10];//这个结构体数组大小为10 string getFileName(string str){    int pos = str.rfind('\\');//找到‘\’位置,rfind反向查找,有篇博文专门说明了find的使用方法可以查一下    return str.substr(pos + 1);} bool cmp(Record r1, Record r2){//降序排列    return r1.count > r2.count;} int main(){    string inStr;    int col;    char tmp[100];    int sum = 0;    while((scanf("%s%d", tmp, &col)) != EOF){ //读取str到char数组和int对象中//      cout << endl << tmp << endl << col << endl; //输出原始数据        bool flag = false; // 这里是**标志位        inStr = tmp;        inStr = getFileName(inStr);//获取文件名,此处的文件名为‘\’之后所有的文件名,并未删减超过16位的,返回值是string格式        for(int i = 0; i < sum; i++){            if(rec[i].filename == inStr && rec[i].column == col){//文件名相同且行号相同,计数+1                rec[i].count++;                flag = true;//有相同的            }        }        if(!flag && sum<9){//如果没有相同的存储数据            rec[sum].filename = inStr;            rec[sum].column = col;            rec[sum].count = 1;            sum++;        }    }    sort(rec, rec + sum, cmp);//0-sum排序    for(int i = 0; i < min(8, sum); i++){//判断存储数目小于8        if(rec[i].filename.length() <= 16){//判断文件名是否大于16个字符,小于直接输出            cout << rec[i].filename;        }        else{            cout << rec[i].filename.substr(rec[i].filename.length() - 16);//else输出后16位        }        cout << " " << rec[i].column << " " << rec[i].count << endl;    }    return 0;}

这道题先建立一个struct之后用来存储所需要的文件名,行号及出现次数,大小为10

在main函数前声明并且规定大小就已经为该struct开辟存储空间,之后可以直接使用

rec[i].filename.length() 返回结构体中string的长度
sort(rec, rec + sum, cmp) 可以对结构体排序
substr (字符串,截取开始位置,截取长度) //返回截取的字

substr('Hello World',0,1) //返回结果为 'H'  *从字符串第一个字符开始截取长度为1的字符串

substr('Hello World',1,1) //返回结果为 'H'  *0和1都是表示截取的开始位置为第一个字符

substr('Hello World',2,4) //返回结果为 'ello'

substr('Hello World',-3,3)//返回结果为 'rld' *负数(-i)表示截取的开始位置为字符串右端向左数第i个字符




原创粉丝点击