C和指针01

由于以后公司开发要用到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值减一 然后读取的还是偶数个
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值