《C语言与指针》第一章例子

#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_coulumns, int const columns[]);

int main(void)
{
 int n_columns; /*the number of column which is deal with*/
 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;
 
 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')
  ;/*以上scanf获取字符后,丢弃最后一位EOF或者'\n',
    防止下次操作时被误认为是第一个字符
    getchar如果没有获得任何字符,则会返回EOF*/
 
 return num;
}

/*此处用数组名做形参,如果修改形参也会改变到实参,input、columns加上const就是为了
  防止此处对其的意外改动。*/
void rearrange(char * output, char const *input, int n_columns, int const columns[])
{
 int col;/*columns数组的下标*/
 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';

}

posted on 2011-07-07 17:11  dusts  阅读(342)  评论(0)    收藏  举报

导航