C和指標讀書筆記(1)
阿新 • • 發佈:2018-12-20
第一章程式碼
程式碼
#include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_COLS 20 /*所能處理的最大列號*/ #define MAX_INPUT 1000 /*每個輸入行的最大長度*/ int read_column_numbers( int columns[], int max); void rearrange( char *output, char const *input, int n_columns, int const columns[]); int main(void){ int n_columns; //進行處理的列標號 int columns[MAX_COLS]; //需要處理的列數 char input[MAX_INPUT]; //容納輸入行的陣列 char output[MAX_INPUT]; //容納輸出行的陣列 n_columns = read_column_numbers(columns,MAX_COLS); /* 讀取、處理和列印剩餘的輸入行 */ while( gets( input ) != NULL){ printf( "Original input : %s\n", input); rearrange( output, input, n_columns, columns); printf("Rearranged line: %s\n", output); } return EXIT_SUCCESS; } /* **讀取處理和列印剩餘行 */ int read_column_numbers( int columns[], int max) { int num = 0; int ch; /* **讀取列標號如果所讀取的數小於 0 則停止 */ while(num<max&&scanf("%d", &columns[num])==1&&columns[num]>0){ num += 1; } //確認已經讀取的標號為偶數個 if(num % 2 != 0){ puts( "Last column number is not paired." ); exit( EXIT_FAILURE ); } //丟棄該行中包含的最後一個數字的內容 while((ch = getchar())!=EOF&&ch!='\n'); return num; } //處理輸入行,將指定列的字元連線在一起,輸出以NUL結尾 void rearrange (char *output, char const *input, int n_columns, int const columns[]) { int col; int output_col; int len; len = strlen(input); output_col=0; //處理每對列標號 for(col=0;col<n_columns;col+=2){ int nchars = columns[col+1]-columns[col]+1; if(columns[col] >= len||output_col==MAX_INPUT-1) break; if(output_col+nchars>MAX_INPUT-1){ nchars = MAX_INPUT - output_col-1; } strncpy(output+output_col, input+columns[col],nchars); output_col += nchars; } output[output_col]='\0'; }
執行結果
本章結構圖總結:
本文參考: 書籍《POINTERS ON C》 作者:Kenneth A. Reek 翻譯:徐波