#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[]); /* 这个程序从标准输入中读取输入行并在标准输出中打印这些输入行 每个输入行的后面一行是该行内容的一部分 输入的第一行是一串列标号,串的最后以一个负数结尾 这些列标号成对出现,说明需要打印的输入行的列的范围 例如: 0 3 10 12 -1 表示第0列到第三列,第10列到第12列的内容被打印。 */ 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 ",input); rearrange(output,input,n_columns,columns); printf("rearrange line:%s ",output); } return EXIT_SUCCESS; } int read_column_numbers(int columns[],int max) { int num=0; int ch; 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!=' '); return num; } 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] = ' '; }