#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(
void
)
{
int
n_columns;
int
columns[
MAX_COLS
];
char
input[
MAX_INPUT
];
char
output[
MAX_INPUT
];
//读取该串列标号
n_columns = read_column_numbers(columns,
MAX_COLS
);
//C语言中,数组以引用形式进行传递
//读取,处理和打印剩余的输入行
while
(gets(input) !=
NULL
)
//gets读取一行,丢弃换行符
{
printf(
"Original input:%s\n"
, input);
rearrange(output, input, n_columns, columns);
printf(
"Rearranged lined:%s\n"
, output);
}
//字符串是一串以NUL结尾的字符 NUL是‘\0'
//%d ->以十进制打印 %o ->八进制 %x->十六进制 %g->浮点数 %c->打印字符 %s->打印字符串
return
EXIT_SUCCESS
;
system(
"pause"
);
return
0;
}
//读取类标号,如果超过规定范围则不予理会
int
read_column_numbers(
int
columns
[],
int
max
)
{
int
num = 0;
int
ch;
//读取列标号,如果读取的数小于0则停止
//1.num<max防止溢出 2.columns[num] >= 0 防止输入出现负值
//&& 逻辑与 也有人叫做短路与
//scanf("%d", &columns[num]) == 1 scanf每次从标准输入读取一个值,如果转换失败,返回0,成功返回1
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
);
}
//丢弃该行中包含最后一个数字的那部分内容
//EOF是一个整形值
while
((ch = getchar()) !=
EOF
&&ch !=
'\n'
)
;
return
num;
}
void
rearrange(
char
*
output
,
char
const
*
intput
,
int
n_columns
,
int
const
columns
[])
{
int
col;
int
output_col;
int
len;
len = strlen(
intput
);
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第一个参数:目标字符串 第二个:源目标串 第三个 复制的字符数
strncpy(
output
+ output_col,
intput
+
columns
[col],
nchars);
output_col += nchars;
}
output
[output_col] =
'\0'
;
}
//scanf()函数需要注意的地方
//1.标量参数前加&
//strcpy 和strcat 1.第一个参数不能使字符串常量 因为字符串常量不能改变 2.需要注意目标字符串要有足够的空间
//否则会出现问题
//strchr 在字符串中进行搜索 第一个参数:字符串 第二个:字符 返回第一次出现的位置