zoukankan      html  css  js  c++  java
  • 编程练习-字符串处理及简单排序

    题目说明:

    简单错误记录

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

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

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

    输入描述:
    一行或多行字符串。每行包括带路径文件名称,行号,以空格隔开。
    文件路径为windows格式
    如:E:V1R2productfpgadrive.c 1325
    输出描述:
    将所有的记录统计并将结果输出,格式:文件名代码行数数目,一个空格隔开,如: fpgadrive.c 1325 1 
    结果根据数目从多到少排序,数目相同的情况下,按照输入第一次出现顺序排序。
    如果超过8条记录,则只输出前8条记录.
    如果文件名的长度超过16个字符,则只输出后16个字符
    输入例子1:
    E:V1R2productfpgadrive.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] = '';
    144         }
    145         
    146         printf("%s %d %d
    ", pNode->filename, pNode->line, pNode->count);
    147         pNode = pNode->next;
    148         ++i;
    149     } 
    150     
    151     return 0;
    152 }
  • 相关阅读:
    全栈必备Linux 基础
    Linux 的 Socket IO 模型
    Vim
    Linux 下使用 Sar 简介
    提高效率,推荐 5 款命令行工具
    Vim小技巧
    剑指Offer 矩形覆盖
    剑指Offer 变态跳台阶
    剑指Offer 跳台阶
    2016 网易校招内推C/C++第二场8.6
  • 原文地址:https://www.cnblogs.com/lztutumo/p/13537415.html
Copyright © 2011-2022 走看看