由于以后公司开发要用到C和Oracle, 又把C和指针看了一篇
然后就写点博客 做点练习(主要是标三星题目)
#include <stdio.h>
#include <stdlib.h>#include <string.h>
#define MAX_COLS 20 //表示最大的列号
#define MAX_INPUT 200 //表示每个输入行的最大长度
bool check_numbers(int columns[]) //课后第五题 添加的函数
{
int i = 0;
int len = sizeof(columns) / sizeof(columns[0]);
bool flag = false;
while(i < len-1)
{
if(columns[i] > columns[i+1]) //保正前一个比后一个小
{
flag = true;
break;
}
}
return flag;
}
int read_column_numbers(int column[], int max)
{
int num = 0;
int ch; //表示作为中间赋值数据
//数据输入 并且进行判断
while( (num<max) && scanf("%d", &column[num])==1 && column[num]>=0 )
num += 1;
//保证是偶数个
if(num % 2 != 0)
{
puts("It must be divided by 2\n");
exit(EXIT_FAILURE);
}
//丢弃最后一部分
while((ch = getchar()) != EOF && ch != '\n') ;
if( !check_numbers(column) )
return 0;
return num;
}
void rearrange(char *output, const char* input, int n_cols, const int columns[])
{
int col; //数组的下标
int output_col = 0; //输出列计数器
int len = strlen(input); //输入行的长度
for(col=0; col<n_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; //下次计算在使用 保证数据的范围可控
}
}
int main()
{
int n_columns; //进行处理的列标号
int columns[MAX_COLS]; //数据列数
char input[MAX_INPUT] = {'0'};
char output[MAX_INPUT] ={'0'};
n_columns = read_column_numbers(columns, MAX_COLS);
if(n_columns == 0)
{
printf("the input data is error\n");
return 0;
}
while( gets(input) != NULL )
{
printf("First input: %s\n", input);
rearrange(output, input, n_columns, columns);
printf("Last output: %s\n", output);
}
return 0;
}
//课后第六题也比较简单啊 可以将num值减一 然后读取的还是偶数个