从标准输入行读取,然后提取数据打印

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#define Max_COLS 20     
#if 0
宏定义,所能处理的最大列号
#endif
#define Max_INPUT 1000  
#if 0
每次输入行的最大长度
#endif
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; 
#if 0
进行处理的列标号
#endif
    int columns[Max_COLS];  
#if 0
需要处理的列数
#endif
    char input[Max_INPUT];  
 #if 0
容纳输入行的数组
#endif
    char output[Max_INPUT]; 
#if 0
容纳输出行的数组
#endif

    n_columns=read_column_numbers(columns,Max_COLS); 
#if 0
读取该串列标号
#endif
    while (fgets(input,sizeof(input),stdin)!=NULL)
    {
        printf("Original input:%s\n",input);
#if 0
输出原来数据
#endif
        rearrange(output,input,n_columns,columns);  
#if 0       
调用函数rearrange
#endif
        printf("Rearrange line:%s\n",output);
        
#if 0
输出提取之后的数据
#endif
    }
    return EXIT_SUCCESS; 
#if 0
在函数库中已经通过宏替换,等价于:return 0;
#endif
}

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 columns number is not paired.");
        exit(EXIT_FAILURE);
    }

    while ((ch=getchar())!=EOF&&ch!='\n')
        ;
    return num;   
}

void rearrange(char *output,char const *input,int n_columns,int const columns[])
{
    int nchars;
    int col;
    int output_col;
    int len;
    
    len=strlen(input);      
#if 0
strlen比较字符串长度,返回值是字符串的长度*/
#endif
    output_col=0;   

    for(col=0;col<n_columns;col+=2){
        nchars=columns[col+1]-columns[col]+1;
#if 0
这段代码用于计算列距离计算
#endif
        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);   
#if 0
strncpy与strcpy都是复制功能,但strncpy返回的是dest地址*/
#endif 
        output_col+=nchars;
        output[output_col]='\0';
    }
}

  • 4
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ApLinuxor

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值