第11周 C和C指针 1.1 输入输出
2016-06-06 16:32
363 查看
问题及代码:
/*从标准输入中读取输入行并在标准输出中打印这些输入行 输入的第一行是一串列标号,串的最后以一个负数结尾 标号成对出现,说明需要打印的输入行的范围 */ #include<stdio.h> #include<string.h> #include<stdlib.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() { int n_columns; //正在处理的列标号 int columns[MAX_COLS]; //需要处理的列数 char input[MAX_INPUT]; // 容纳输入行数组 char output[MAX_INPUT]; //读取该串列表号 n_columns = read_column_numbers(columns,MAX_COLS); //用数组的地址columns //读取、处理和打印剩下的输入行 while(gets( input ) !=NULL) { printf("Original input:%s\n",input); rearrange(output,input,n_columns,columns ); printf("Rearranged line:%s\n",input); } return EXIT_SUCCESS; } //读取列标号,超出范围不予理会 int read_column_numbers(int columns[],int max) { int num =0; int ch; //为何ch被声明为整型,因为EOF是整型值 //取得列标号,如果所读取的数小于0则停止 while(num < max && scanf("%d",&columns[num])== 1 //输入的字符合法的转为整数,再转为二进制存储数组元素,然后scanf()返回1. && columns[num] >=0 ) num += 1; //确认已经读取的标号为偶数个,因为他们以对的方式出现 if(num % 2 != 0) { puts("Last column number is paired."); //是gets的输出版本,它把指定字符串写到标准输出并在末尾添上一个换行符 exit(EXIT_FAILURE); //调用exit函数,返回给操作系统 } //丢弃该行中包含最后一个数字的那部分内容 while(ch=getchar()!=EOF && ch!='\n') //EOF文件结尾 ; return num; } //处理输入行,将指定列的字符连在一起,输出行以NUL为结尾 void rearrange(char *output,char const *input, int n_column,int const columns[]) { int col; //数组columns下标 int output_col; //输出列计数器 int len; //输入行的长度 len = strlen(input); output = 0; //处理每对列标号 for(col= 0;col < MAX_COLS;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] = '\n'; }
相关文章推荐
- Javascript闭包详解,真的很无脑
- 给Android开发者的RxJava 详解(文章转载)
- ModBuS协议校验码问题
- 【Unity】Unity事件管理,可有效管理动画事件
- Zend Studio for Eclipse的java.lang.NullPointerExcep
- 获取Android SHA1 、生成jks密钥、签名Apk
- 为什么加了jquery mobile 会有 Loading 字样在页面底部?【已解决】
- 线程同步--关键段CRITICAL_SECTION
- 2016/06/06
- Intersection of Two Arrays
- CATalyst——针对末级缓存侧信道攻击的防御技术
- 代码是如何控制硬件的
- 搜索一个class或者方法或者id写在哪个JS或CSS里面
- DB2中的数据加密
- python正则表达式 Python Re模块
- CentOS 7 +Nginx
- VS项目中用到QtNetwork模块时的注意事项
- 将文件中内容按行写入多个文件
- nhibernate使用sql查询
- VMware Workstation 12.0.0 Pro 正式版/注册码/注册机