AmazingCounters.com

《c和指针》1.5编程练习问题

《c和指针》1.5编程练习问题

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define MAX_COLS 20
#define MAX_INPUT 1000

int read_column_numbers(int column[], 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("Rearrange line : %s\n", output);
}
return EXIT_SUCCESS;
}

int read_column_numbers(int columns[], int max){
int num;
int ch;

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;

}


void rearrange(char *output, char const *input,
int n_columns, int const columns[]){
int col;
int output_col;
int len;

len = strlen(input);
output_col = 0;
int nchars = columns[col+1] - columns[col] + 1;
if(columns[col]>=len){
continue;
}
if(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';
}

1.问题:

rearrange函数对输入字符串进行处理时,若输入截取位数为 a b c d -1 其中a<b, c<d, a>c  切输入字符串的长度在a b 之间

则会出现c~d 无法截取的情况

例:

10 15 1 5 -1

abcdefghijk    //十一位

结果为:

k

 

问题分析:

strncpy(output + output_col, input + columns[col], nchars);

在第一次复制时,数组越界,会复制该数组后的其他内存中的数据 '\0'

此时字符串output已到结尾,'\0'后字符无法读取,因此只有第一次复制的字符。

解决:

 在rearrange函数中添加

if(columns[col+1]>len){
  nchars = len-columns[col];
}

若截取位数超过字符串长度,改变复制的位数,防止数组越界。

2.完善 :当输入列标号不是偶数时,也能读取,

如果是奇数个,最后一个列范围为列标号指定的列数到结尾

去除

if(num%2!=0){
puts("Last column number is not paired.");
exit(EXIT_FAILURE);
}

并在strncpy(output + output_col, input + columns[col], nchars);前面添加

if(columns[col+1]<=0){
  nchars = len - columns[col];
}

posted @ 2015-11-19 21:50  hugue  阅读(388)  评论(0编辑  收藏  举报