C实现特定字符串数据的排序与输出

简介: 一、案例完整代码 点击(此处)折叠或打开/**************************************************************** * Name : sort_and_output.c * Author : dyli2000 * Date : 20121102 * Description :     对学生成绩由高到低输出案例。

一、案例完整代码


点击(此处)折叠或打开

  1. /****************************************************************
  2. * Name : sort_and_output.c
  3. * Author : dyli2000
  4. * Date : 20121102
  5. * Description :
  6.     对学生成绩由高到低输出案例。扩展功能:
  7. 随机产生学生成绩,并写入到fin.txt;然后读fin.txt中的数据,排序输出到out.txt
  8. 文件。
  9. ****************************************************************/

  10. #include stdio.h>
  11. #include time.h>
  12. #include string.h>

  13. #define DEBUG
  14. #define TIMES 20

  15. typedef struct StringNode
  16. {
  17.     char str[100];
  18.     int num;
  19. }str_node;

  20. /* Must put it here !! */
  21. str_node str_node_array[TIMES];
  22. int fsort(char* fin,char* fout)
  23. {
  24.     #ifdef DEBUG
  25.     printf("Before sort the string:\n%s\n",fin);
  26.     #endif

  27.     //str_node str_node_array[TIMES]; // Error usage
  28.     memset(str_node_array,0,TIMES);

  29.     int in = 0;
  30.     char *p[TIMES];
  31.     char *buf = fin;
  32.     char *p_num = NULL;
  33.     char *outer_ptr = NULL;
  34.     char *inner_ptr = NULL;

  35.     #ifdef DEBUG
  36.     printf("---------------------1111111111111111111111111111111111 buf:\n%s\n",buf);
  37.     #endif

  38.     while((p[in] = strtok_r(buf,"\n",&outer_ptr)) != NULL && in TIMES)
  39.     {
  40.         buf = p[in];
  41.         strcpy(str_node_array[in].str,buf);

  42.         if( (strtok_r(buf," ",&inner_ptr) ) != NULL )
  43.         {
  44.             if( (p_num = strtok_r(NULL," ",&inner_ptr) ) != NULL)
  45.             {
  46.                 str_node_array[in].num = atoi(p_num);
  47.                 #ifdef DEBUG
  48.                 printf("str_node_array[%d].str:%s\n",in,str_node_array[in].str);
  49.                 printf("str_node_array[%d].num:%d\n",in,str_node_array[in].num);
  50.                 #endif
  51.             }
  52.         }

  53.         in++;
  54.         buf = NULL;
  55.     }
  56.     #ifdef DEBUG
  57.     printf("---------------------2222222222222222222222222222222222 str_node_array[0].str = %s\n",str_node_array[0].str);
  58.     #endif

  59.     //#if 0
  60.     int count = 0;
  61.     int j = 0;
  62.     str_node tmpnode;

  63.     for(; count TIMES; count++)
  64.     {
  65.         /* upper bubble */
  66.         for(; j TIMES - count; j++)
  67.         {
  68.             if(str_node_array[j].num str_node_array[j+1].num)
  69.             {
  70.                 strcpy(tmpnode.str,str_node_array[j].str);
  71.                 tmpnode.num = str_node_array[j].num;

  72.                 strcpy(str_node_array[j].str,str_node_array[j+1].str);
  73.                 str_node_array[j].num = str_node_array[j+1].num;

  74.                 strcpy(str_node_array[j+1].str,tmpnode.str);
  75.                 str_node_array[j+1].num = tmpnode.num;
  76.             }
  77.         }
  78.         j = 0;
  79.     }
  80.     //#endif

  81.     #ifdef DEBUG
  82.     printf("---------------------3333333333333333333333333333333333\n");
  83.     #endif

  84.     j = 0;
  85.     int len = 0;
  86.     memset(fout,0,300);
  87.     for(; j TIMES; j++)
  88.     {
  89.         // strcpy(fout+j,str_node_array[j].str); // The wrong
  90.         len += sprintf(fout+len,"%s \n",str_node_array[j].str);
  91.         printf("--------------------- %d,str_node_array[%d].str = %s,str_node_array[j].num = %d\n"
  92.                 ,j,j,str_node_array[j].str,str_node_array[j].num);
  93.     }
  94.     *(fout+len) = '\0';
  95.     printf("After sort the string\n%s\n",fout);

  96.     return 0;
  97. }

  98.  

  99. int main()
  100. {
  101.     FILE *fp;
  102.     char write_buf[100];
  103.     char read_buf[300];
  104.     char out_buf[300];
  105.     int count = 0;

  106.     memset(write_buf,0,100);
  107.     memset(read_buf,0,300);
  108.     memset(out_buf,0,300);

  109.     fp = fopen("in.txt","w+");
  110.     if(fp == NULL)
  111.     {
  112.         perror("fopen");
  113.         return;
  114.     }

  115.     /* Write to file */
  116.     srand( (unsigned int)time(0));
  117.     for(; count TIMES; count++)
  118.     {
  119.         sprintf(write_buf,"Name %d \n",rand()%100);
  120.         fwrite(write_buf,1,strlen(write_buf),fp);
  121.     }
  122.     fseek(fp,0L,SEEK_END);
  123.     int buf_len = ftell(fp);
  124.     fseek(fp,0L,SEEK_SET); // => rewind(fp);

  125.     /* Read from file */
  126.     fread(read_buf,1,buf_len,fp);
  127.     read_buf[buf_len] = '\0';
  128.     #ifdef DEBUG
  129.     printf("%s",read_buf);
  130.     #endif

  131.     /* sort and output to out.txt */
  132.     #ifdef DEBUG
  133.     printf("----------------------------------------------\n");
  134.     #endif
  135.     fsort(read_buf,out_buf);

  136.     #ifdef DEBUG
  137.     printf("==============================================\n");
  138.     #endif

  139.     FILE *stream;
  140.     stream = fopen("out.txt","w+");
  141.     if(stream == NULL)
  142.     {
  143.         perror("fopen");
  144.         return;
  145.     }

  146.     fwrite(out_buf,1,strlen(out_buf),stream);

  147.     #ifdef DEBUG
  148.     printf("$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$\n");
  149.     #endif

  150.     fclose(fp);
  151.     fclose(stream);
  152.     return 0;
  153. }

 

二、运行效果

image

图1 随机生成的in.txt文件


image

图2 排序后输出的out.txt文件

 

三、几个重要说明

要实现这个功能,涉及随机数据的生成、文件的读写、数据排序、字符串的分割与合并。下面这段代码为其中的一个关键。

实现数据分割的关键代码。


  1. while((p[in] = strtok_r(buf,"\n",&outer_ptr)) != NULL && in TIMES)
  2.     {
  3.         buf = p[in];
  4.         strcpy(str_node_array[in].str,buf);

  5.         if( (strtok_r(buf," ",&inner_ptr) ) != NULL )
  6.         {
  7.             if( (p_num = strtok_r(NULL," ",&inner_ptr) ) != NULL)
  8.             {
  9.                 str_node_array[in].num = atoi(p_num);
  10.                 #ifdef DEBUG
  11.                 printf("str_node_array[%d].str:%s\n",in,str_node_array[in].str);
  12.                 printf("str_node_array[%d].num:%d\n",in,str_node_array[in].num);
  13.                 #endif
  14.             }
  15.         }

  16.         in++;
  17.         buf = NULL;
  18.     }

(1)、本例数据特点


  1. Name 96
  2. Name 93
  3. Name 83
  4. Name 81
  5. Name 74
  6. Name 70
  7. Name 66
  8. Name 55
  9. Name 54
  10. Name 52

从in.txt读出来的字符串,先要根据’\n’进行行分割,再根据’ ’进行行中分割。这里使用普通的strtok函数是实现不了的。参考另外一篇博文《strtok的缺陷》。

(2)、strtok_r()函数

strtok_r()是系统专门为解决这个问题而设计的函数。参数列表:

p_str = strtok_r(buf,"\n",&outer_ptr))

buf : 要分割的字符串指针;

“\n”: 分割符;

&outer_ptr : 指向被分割成的后段字符串的指针的地址。

p_str :指向被分割成的前段字符串的指针。

相关文章
|
1月前
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
字符串,每个里面包含0-N个数字,如3,8,2,编写函数,将两个这样的字符串合并,并且输出的字符串里面没有重复的数字,并从大到小排列.
21 0
|
2月前
输入3个数a,b,c,按大小顺序输出
输入3个数a,b,c,按大小顺序输出。
39 15
|
3月前
|
存储 搜索推荐 Serverless
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
用指针和动态内存分配的方法输入10,2,30, 4,5,按输入顺序逆置排序,输出排序后的元素,即输出5,4,30,2,10
18 0
|
10月前
|
Java
如何实现倒序输出
如何实现倒序输出
72 0
|
10月前
|
C++
c++输出字符串
c++输出字符串
73 1
|
11月前
|
C语言 C++
输入一个字符串并使其反序输出
输入一个字符串并使其反序输出
|
测试技术
字符串中有多少个不重复的字符并按由前到后的顺序输出一个新的字符串和该字符串长度的整数
字符串中有多少个不重复的字符并按由前到后的顺序输出一个新的字符串和该字符串长度的整数
56 0
|
C语言
简单输出一个数组
简单输出一个数组
62 0
简单输出一个数组
|
C语言 C++
将一个字符串str的内容颠倒(逆序)过来,并输出
将一个字符串str的内容颠倒(逆序)过来,并输出
261 0
将一个字符串str的内容颠倒(逆序)过来,并输出
将数组a中的元素倒序输出
将数组a中的元素倒序输出
96 0
将数组a中的元素倒序输出