#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() {
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("Rearranged line:%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("Last column number is not paired.");
exit(EXIT_FAILURE);
}
//丢弃该行包含最后一个数字的那部分内容
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;
//如果输入行结束或输出行数组已满,结束任务
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';
}
注释:
/**/ 不能嵌套,如果要从逻辑上删除一段C代码,最好使用#if指令,如:
#if 0 statements #endif
gets函数从标准输入读取一行文本并把它存储于作为参数传递给它的数组中。gets函数丢弃换行符,并在该行末尾存储一个NUL字节(一个NUL字节是指字节模式为全0的字节,类似'\0'这样的字符常量)。然后,gets函数返回一个非NULL值,表示该行已被成功读取。
C语言不存在string类型,但存在一个约定:字符串就是一串以NUL字节结尾的字符。
NUL是ASCII字符集中'\0'字符的名字,它的字节模式为全0。NULL指一个其值为0的指针。它们都是整型值,其值也相同,所以它们可以互换使用。
符号NULL在头文件stdio.h中定义。另一方面,并不存在预定义的符号NUL,所以如果你想使用它而不是字符常量'\0',你必须自行定义。
puts函数是gets函数的输出版本,它把指定的字符串写到标准输出并在末尾添上一个换行符。
getchar函数从标准输入读取一个字符并返回它的值。
字符只是小整型数而已,所以用一个整型变量容纳字符值并不会引起任何问题。
转载请注明:MitNick » C和指针笔记-第一章