|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 sunlei20239 于 2012-11-22 22:04 编辑
在rearrange函数中的for循环col+=2,我觉得是col++就可以了
为什么是+2呢源程序如下:
/*
**首先读取一串列标号。这些列标号成对出现,表示输入行的列范围。这串列标号以一个负值结尾,作为结束标志。
**剩余的输入行将被程序读入并打印,然后输出行中被选中范围的字符串被提取出来并打印。
*/
#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)//读取,处理和打印剩余的输入行
{
printf("Oreginal input:%s\n",input);
rearrange(output,input,n_columns,columns);
printf("Rearrange line:%s\n",output);
}
return EXIT_SUCCESS;
}
int read_column_numbers(int columns[],int max)//读取列表号,如果超出规定范围则不予理会
{
int num=0;
int ch;
printf("请输入要读取的起始列,和读取的末尾列:");
//取得列表号,如果所读取的数小于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);
}
//丢弃该行中包含最后一个数组的那部分内容,过滤掉最后输入的-1
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;//nchars=9-4+1=6 若是第二次循环不就变成nchars= 20-12-1=9了
//如果输入行结束或输出行数组已满,就结束任务
if(columns[col]>=len||output_col==MAX_INPUT-1)
break;
//如果输出行数组空间不够,只复制可以容纳的数据
if(output_col+nchars>MAX_INPUT-1)
nchars=MAX_INPUT-output_col-1;//20-0-1=19
//复制相关的数据
strncpy(output+output_col,input+columns[col],nchars);
//strncpy(output[0],input[4],6)
//output_col=0+6=6,此意思是将数组下标标在最后
output_col+=nchars;
}
output[output_col]='\0';
}
|
|