码迷,mamicode.com
首页 > 其他好文 > 详细

程序1.1 重排字符 (rearrange.c)

时间:2015-05-21 22:28:46      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

  1 /*
  2 ** 这个程序从标准输入(键盘)中读取输入行并按需求处理后在标准输出(屏幕)中打印,
  3 ** 每个输入行的后面一行是该行按需求处理后的输出内容。
  4 **
  5 ** 输入的第1行是一串列标号,串的最后以一个负数结尾。
  6 ** 这些列标号成对出现,说明需要打印的输入行的列的范围。
  7 ** 例如,0 3 10 12 -1 表示第0列到第3列,第10列到第12列的内容将被打印。
  8 */
  9 
 10 #include <stdio.h>
 11 #include <stdlib.h>
 12 #include <string.h>
 13 #define MAX_COLS     20        /* 所能处理的最多列标号数量 */
 14 #define MAX_INPUT    1000     /* 所能处理的最大输入行长度 */
 15 
 16 int read_column_numbers(int columns[], int max);
 17 void rearrange(char *output, char const *input, int n_columns, int const columns[]);
 18 
 19 int main(void)
 20 {
 21     int     n_columns;               /* 记录君:实际读取的列标号个数 */
 22     int     columns[MAX_COLS];       /* 容器君:实际读取的列标号们 */
 23     char    input[MAX_INPUT];        /* 容器君:输入行字符串 */
 24     char    output[MAX_INPUT];       /* 容器君:输出行字符串 */
 25 
 26     /*
 27     ** 读取该串列标号并统计个数
 28     */
 29     n_columns = read_column_numbers(columns, MAX_COLS);
 30 
 31     /*
 32     ** 读取、处理和打印剩余的输入行
 33     */
 34     while(gets(input) != NULL)
 35     {
 36         printf("原始输入: %s\n", input);
 37         rearrange(output, input, n_columns, columns);
 38         printf("截取输出: %s\n", output);
 39     }
 40 
 41     return EXIT_SUCCESS;
 42 }
 43 
 44 /*
 45 ** 读取列标号(存入数组),超出规定范围(2)则不予理会
 46 **
 47 ** 参数表: columns     列标号存储用数组
 48 **            max       数组最大容量
 49 **
 50 ** 返回值:   num       实际读取的列标号个数
 51 */
 52 int read_column_numbers(int columns[], int max)
 53 {
 54     int num = 0;    /* 计数君:当前已读入列标号的数量 */
 55     int end_ch;     /* 记录君:结束字符 */
 56 
 57     /*
 58     ** 读入列标号,如果所读取的数小于0则停止
 59     */
 60     while(num < max && scanf("%d", &columns[num]) == 1 && columns[num] >= 0)
 61     {
 62         num += 1;
 63     }
 64 
 65     /*
 66     ** 确认已经读取的标号为偶数个,因为它们是以对儿的形式出现的
 67     */
 68     if(num % 2 != 0)
 69     {
 70         puts("Last column number is not paired.");
 71         exit(EXIT_FAILURE);
 72     }
 73 
 74     /*
 75     ** 丢弃超出的列标号,防止被解释为第1行数据
 76     */
 77     while( (end_ch = getchar()) != EOF && end_ch != \n )
 78         ;
 79 
 80     return num;
 81 }
 82 
 83 /*
 84 ** 处理输入行,将指定列的字符连接在一起,输出行以NUL结尾
 85 */
 86 void rearrange(char *output, char const *input, int n_columns, int const columns[])
 87 {
 88     int i;            /* 计数君:columns 数组的下标 */
 89     int len;         /* 记录君:输入行的长度 */
 90     int out_emp_i;    /* 计数君:输出数组可用空间首位置下标 */
 91 
 92     len = strlen(input);
 93 
 94     out_emp_i = 0;    /* bug:忘记初始化 */ 
 95 
 96     /*
 97     ** 处理每对列标号
 98     */
 99     for(i = 0; i < n_columns; i += 2)
100     {
101         int nchars = columns[i+1] - columns[i] + 1;        /* 本次写入输出的字符数 */
102 
103         /*
104         ** 如果输入行结束或输出行数组已满,则结束任务
105         */
106         if(columns[i] >= len || out_emp_i == MAX_INPUT - 1)
107         {
108             break;
109         }
110 
111         /*
112         ** 如果输出行数据空间不够,只复制可以容纳的数据
113         */
114         if(out_emp_i + nchars > MAX_INPUT - 1)
115         {
116             nchars = MAX_INPUT - 1 - out_emp_i;
117         }
118 
119         /*
120         ** 复制相关的数据 (赞指针偏移的用法)
121         */
122         strncpy(output + out_emp_i, input + columns[i], nchars);
123         out_emp_i += nchars;
124     }
125     output[out_emp_i] = \0;
126 }

 

程序1.1 重排字符 (rearrange.c)

标签:

原文地址:http://www.cnblogs.com/woodenji/p/4520707.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!