您的位置:首页 > 其它

第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';
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: