[CHAPTER 01] 1.1 字符重排

#include <stdio.h>
#include <stdlib.h>
#include<string.h>

#define MAXCOLS 20
#define MAXINPUT 1000

int ReadColumnNumbers(int columns[], int Max);
void rearrange(char*output, char const *input, int nColumns, int const columns[]);

int main(void)
{
    int nColumns;
    int columns[MAXCOLS];
    char input[MAXINPUT];
    char output[MAXINPUT];
    /*读取该串列标号*/
    nColumns = ReadColumnNumbers(columns, MAXCOLS);

    while (gets(input) != NULL)
    {
        printf("Original input:%s\n", input);
        rearrange(output, input, nColumns, columns);
        printf("Rearranged line:%s\n", output);
    }
    return EXIT_SUCCESS;
}

int ReadColumnNumbers(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')
        ;
    return num;
}

void rearrange(char*output, char const *input, int nColumns, int const columns[])
{
    int col;
    int outputCol;
    int len;

    len=strlen(input);
    outputCol=0;
    /*处理每对列标号*/
    for(col=0; col<nColumns; col+=2)
    {
        int nchars=columns[col+1]-columns[col]+1;
        /*若输入行借书或输入行已满,即结束*/
        if(columns[col]>=len||outputCol==MAXINPUT-1)
            break;
        /*若空间不够,只复制可容纳的数据*/
        if(outputCol+nchars>MAXINPUT-1)
            nchars=MAXINPUT-outputCol-1;
        /*复制相关数据*/
        strncpy(output+outputCol,input+columns[col],nchars);
        outputCol+=nchars;
    }
    output[outputCol]='\0';
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值