#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)//gets函式從標準輸入讀取一行文字並把它儲存於作為引數傳遞給它的陣列中
{
printf("Original input:%s\n",input);
rearrange( output ,input,n_columns,columns);
printf("Rearrangd 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;//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';
}
例:第一行輸入 4 9 12 20 -1 時,第二行輸入 abcdefghijklmnopqrstuvwxyz時
輸出為 :
Original input:abcdefghijklmnopqrstuvwxyz
Rearranged line:efghijmnopqrstu
表示將原來輸入的第4~9行,12~20行,抽出來重新輸出,-1表示結束標誌。
注意:gets與getchar的區別:
最重要的區別是gets讀一行,getchar()讀一個字元。
先看原型:
char * gets(char * ptr);
int getchar(void);
作用是:
gets()用於從標準輸入流stdin讀入一個整行(以'\n'或EOF)結束,寫入ptr指向的字元陣列,並返回這個指標;出錯或遇到檔案結束時則返回NULL。行末的'\n'從流中取出,但不寫入陣列。gets()不檢查被寫入的陣列大小。
getchar()用於從標準輸入流stdin讀入一個字元,並返回這個字元。如果讀到檔案結尾,則返回EOF。注意到EOF不能用char型別表示,所以getchar()函式返回的是一個int型的數。使用時也應該注意這一點。