1. 程式人生 > >C和指標讀書筆記(1)

C和指標讀書筆記(1)

第一章程式碼

程式碼

#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 翻譯:徐波