ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

编程练习-字符串处理及简单排序

2020-08-20 19:32:34  阅读:328  来源: 互联网

标签:node struct 编程 filename header pTmp 字符串 line 排序


题目说明:

简单错误记录

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 64M,其他语言128M

 

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

输入描述:
一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
文件路径为windows格式
如:E:\V1R2\product\fpgadrive.c 1325
输出描述:
将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 
结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
如果超过8条记录,则只输出前8条记录.
如果文件名的长度超过16个字符,则只输出后16个字符
输入例子1:
E:\V1R2\product\fpgadrive.c 1325
输出例子1:
fpgadrive.c 1325 1

C语言实现代码
  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 
  5 struct record {
  6     char filename[256];
  7     int line;
  8     int count;
  9     struct record *prev;
 10     struct record *next;
 11 };
 12 
 13 static struct record *header = NULL;
 14 
 15 static char *getfilename(char *str)
 16 {
 17     char s[2] = "\\";
 18     char *token, *pretoken;
 19 
 20     if (str == NULL) {
 21         return NULL;
 22     }
 23 
 24     pretoken = NULL;
 25     token = strtok(str, s);
 26     while (token != NULL) {
 27         pretoken = token;
 28         token = strtok(NULL, s);
 29     }
 30 
 31     return pretoken;
 32 }
 33 
 34 void fillRecord(char *filename, int line)
 35 {
 36     struct record *curNode, *pTmp;
 37     
 38     if (filename == NULL || line == -1) {
 39         return;
 40     }
 41 
 42     /* 从已有节点查找,找到就++count,没找到就重新申请节点插入链表 */
 43     for (curNode = header->next; curNode != header; curNode = curNode->next) {
 44         if (strcmp(curNode->filename, filename) == 0 && curNode->line == line) {
 45             ++(curNode->count);
 46             return;
 47         }
 48     }
 49 
 50     pTmp = (struct record*)malloc(sizeof(struct record));
 51     if (pTmp == NULL) {
 52         return;
 53     }
 54     else {
 55         memset(pTmp->filename, 0, sizeof(pTmp->filename));
 56         memcpy(pTmp->filename, filename, sizeof(pTmp->filename) - 1);
 57         pTmp->line = line;
 58         pTmp->count = 1;
 59     }
 60     /* 将节点插入双向链表尾部 */
 61     pTmp->prev = header->prev;
 62     header->prev->next = pTmp;
 63     header->prev = pTmp;
 64     pTmp->next = header;
 65 }
 66 
 67 void insertsort(struct record *header)
 68 {
 69     struct record *P_node, *j_node, *pTmp;
 70     char tmpfile[17] = {0};
 71     int tmpline;
 72     
 73     if (header->next == header) {
 74         return;
 75     }
 76 
 77     pTmp = (struct record*)malloc(sizeof(struct record));
 78     if (pTmp == NULL) {
 79         return;
 80     }
 81 
 82     for (P_node = header->next->next; P_node != header; P_node = P_node->next) {
 83         memcpy(pTmp->filename, P_node->filename, sizeof(P_node->filename));
 84         pTmp->count = P_node->count;
 85         pTmp->line = P_node->line;
 86         j_node = P_node;
 87         for (j_node = P_node; j_node->prev != header && j_node->prev->count < pTmp->count; j_node = j_node->prev) {
 88             /* 将j_node的prev节点往后移 */
 89             memcpy(j_node->filename, j_node->prev->filename, sizeof(j_node->prev->filename));
 90             j_node->line = j_node->prev->line;
 91             j_node->count = j_node->prev->count;
 92         }
 93         memcpy(j_node->filename, pTmp->filename, sizeof(pTmp->filename));
 94         j_node->line = pTmp->line;
 95         j_node->count = pTmp->count;
 96     }
 97     
 98     free(pTmp);
 99 }
100 
101 int main(int argc, char **argv)
102 {
103     char buf[4096];
104     char *strpath, *filename;
105     int line;
106     char *strto;
107     char s[2] = " ";
108     struct record *pNode;
109     int i, len;
110     
111     /* 申请一个struct record节点作为header,count赋值为-1 */
112     header = (struct record*)malloc(sizeof(struct record));
113     if (header == NULL) {
114         return -1;
115     }
116     else {
117         header->count = -1;
118         header->prev = header;
119         header->next = header;
120     }
121     
122     while (fgets(buf, sizeof(buf), stdin)) {
123         strto = strtok(buf, s);
124         strpath = strto;
125         strto = strtok(NULL, s);
126         
127         line = atoi(strto);
128         /* 从strpath中提取出文件名 */
129         filename = getfilename(strpath);
130         /* 更新节点或者申请一个新节点 */
131         fillRecord(filename, line);
132     }
133     
134     /* 稳定的插入排序算法 */
135     insertsort(header);
136     
137     i = 0;
138     pNode = header->next;
139     while (pNode != header && i < 8) {
140         len = strlen(pNode->filename);
141         if (len > 16) {
142             memmove(pNode->filename, pNode->filename + (len - 16), 16);
143             pNode->filename[16] = '\0';
144         }
145         
146         printf("%s %d %d\n", pNode->filename, pNode->line, pNode->count);
147         pNode = pNode->next;
148         ++i;
149     } 
150     
151     return 0;
152 }

 

标签:node,struct,编程,filename,header,pTmp,字符串,line,排序
来源: https://www.cnblogs.com/lztutumo/p/13537415.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有