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

猜你喜欢

转载自blog.csdn.net/weixin_42512488/article/details/82839502