《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';
}
浙公网安备 33010602011771号