• 《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 ",input);
    rearrange(output,input, n_columns,columns);
    printf("Rearrange line : %s ", 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!=' ')
    ;
    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] = '';
    }

    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);

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

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

    解决:

     在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];
    }

    --------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------学习记录,都是基本知识------------------------------------------------------------------------ ---------------------------------------------------------------------------------------------------------------------------------------------------------------------
  • 相关阅读:
    SpringBoot打包的程序部署到服务器后一直在后台运行
    ubuntu搭建mysql数据库
    解决ubuntu16.04 ‘E: 无法获得锁 /var/lib/dpkg/lock-frontend
    项目部署篇之——下载安装Xftp6,Xshell6
    linux 文件 chgrp、chown、chmod
    linux 正确的关机方法
    linux 常用命令
    spring 事务
    Spring 中 ApplicationContext 和 BeanFactory 的区别
    java 异常处理
  • 原文地址:https://www.cnblogs.com/hugue/p/4979149.html
Copyright © 2020-2023  润新知