#include
#include
#include
#define MAX_COLS 20 /*定义 所能处理的最大列号*/
#define M
#include
#include
#include
#define MAX_COLS 20 /*定义 所能处理的最大列号*/
#define MAX_INPUT 1000 /*每个输入的最大长度*/
int read_column_numbers(int colunms[]);
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("原始的输入的内容是: %s\n",input);
rearrange(output, input, n_columns,columns);
printf("之后的结果是:%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("输入的行号不是偶数个 所以不能配对 系统退出");
exit(EXIT_FAILURE);
}
/*现在丢弃该行中包含最后*/
while ((ch=getchar())!=EOF&&ch!='\n')
;
return num;
}
/*现在开始处理行的内容,将指定的字符连接在一起,输出行的内容是以NUL做结尾*/
void rearrange(char *output, char cons *input int n_columns, int const columns[])
{
int col;
int output_col;/*输入列的计算器*/
int len; /*输出行的长度*/
len = strlen(input);
output_col = 0;
/*处理每对的列标号*/
for (col = 0;col
int nchars = colunms[col+1]-columnx[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';
}
/*这个程序从标准输入中读入行并且在输出行中打印这些输入行
**每个输入行的后面一行是该行的内容
输入的第一行是一串列标号而串的结尾是一个负数结尾
而这些的列标号是成对的出现 说明要打印的输出行的范围
比如 0 3 10 12 -1 表示第0列到第3列,第10列到第12列的内容将被打印*/
这些代码在codeblock里一点编译就是基本没反应
使用wintc编译可以 但是有两个解决不掉的错误
求达人指点
展开
全部