#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[]);
/*
	这个程序从标准输入中读取输入行并在标准输出中打印这些输入行
	每个输入行的后面一行是该行内容的一部分
	输入的第一行是一串列标号,串的最后以一个负数结尾
	这些列标号成对出现,说明需要打印的输入行的列的范围
	例如: 0 3 10 12 -1 表示第0列到第三列,第10列到第12列的内容被打印。
*/
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("original 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;
	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 n_columns,int const columns[])
{
	int col;
	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';
}

最新文章

  1. HDU 1686 &amp; KMP
  2. Block作为property属性实现页面之间传值(代替Delegate代理与协议结合的方法)
  3. C语言常用排序全解(转)
  4. VC++ 在类中添加多线程操作
  5. SAP Connector 3.0 .Net 开发
  6. JavaScript之简易计算器
  7. POJ1159 Palindrome(dp)
  8. 学习微信小程序之css17clearfix原理
  9. 面试前的准备---C#知识点回顾----04
  10. php 垃圾回收机制----写时复制和引用计数
  11. [LeetCode]题解(python):151-Reverse Words in a String
  12. httpWebRequest.ContentType 属性、值 类型用法
  13. 利用CSS简单布局的不同组合类型
  14. js获取浏览器版本
  15. Node js redis
  16. CDQ分治入门 + 例题 Arnooks&#39;s Defensive Line [Uva live 5871]
  17. git----------SourceTree如何连接ssh的仓库地址,这里记录的是客户端需要做的事
  18. Docker(二十)-Docker容器CPU、memory资源限制
  19. Noip数学整理
  20. android的消息处理机制(图文+源码分析)—Looper/Handler/Message[转]

热门文章

  1. C# TryParse()用法
  2. JAVA的高并发编程
  3. Python运维开发基础-概述-简介
  4. 关于使用JQuery追加Option标签时使用三元运算符添加选中属性的解决办法
  5. 浅谈js中如何动态添加表头/表列/表格内容
  6. WMware虚拟机NAT模式配置网络设置Linux虚拟机固定IP
  7. 深搜(DFS)广搜(BFS)详解
  8. Codeforces 828B Black Square(简单题)
  9. react学习01
  10. 如何通过binlog获取我们想要的MySql语句?