程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 程序1.1 重排字符 (rearrange.c),1.1rearrange.c

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

編輯:關於C語言

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


  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. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved