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

《c和指针》1.5编程练习问题的更多相关文章

  1. 华为面试题——一道关于指针方面的编程题(C/C++)

    int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素 ...

  2. C++多线程编程入门之经典实例

    多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制,但Windows系统 ...

  3. C#不安全代码和指针

    从通常情况下来看,为了保持类型安全,默认情况C# 不支持指针算法. 不过,当你需要使用指针的时候,请通过使用 unsafe 关键字,可以定义可使用指针的不安全上下文. 有关指针的更多信息,请参见主题指 ...

  4. (转) 谈C/C++指针精髓

    原文:http://www.cnblogs.com/madengwei/archive/2008/02/18/1072410.html   [摘要]    指针是C和C++语言编程中最重要的概念之一, ...

  5. Linux 编程学习笔记----ANSI C 文件I/O管理

    转载请注明出处:http://blog.csdn.net/suool/article/details/38129201 问题引入 文件的种类 依据数据存储的方式不同,能够将文件分为文本文件和二进制文件 ...

  6. C语言指针操作

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...

  7. [C++]指针与多级指针(图解)

    声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 演示: /* @author:John ...

  8. 来自Unix/Linux的编程启发录

    本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布重点内容 2017年第一篇文章,祝各位好友新年快乐. 年前因为不小心坐到了自己左手大拇指导致轻微的骨裂,没有按时更新,实在是羞愧.今年 ...

  9. 第22课 weak_ptr弱引用智能指针

    一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp ...

  10. 少儿编程|Scratch编程教程系列合集,总有一款适合你

    如果觉得资源不错,友情转发,贵在分享!!! 少儿编程Scratch: 少儿编程Scratch第一讲:Scratch完美的初体验少儿编程Scratch第二讲:奇妙的接球小游戏少儿编程Scratch第三讲 ...

随机推荐

  1. hdu4662MU Puzzle

    http://acm.hdu.edu.cn/showproblem.php?pid=4662 I+3*U模6为2或4的都可以 一个U相当于3个I  而I只能1->2->4->8..如 ...

  2. php.ini 干了些啥?

    今天又重新看了一遍php.ini 的各种配置介绍,感觉还是官网说的比较靠谱,朋友,你所要找的,都在这里了. http://www.php.net/manual/zh/ini.core.php

  3. 函数fsp_alloc_free_page

    从fsp中分配32个碎片页 /**********************************************************************//** Allocates ...

  4. bzoj1965

    很明显,求方程x*2^m=L (mod n+1)的解(1<=x<=n) var n,m,l,x,y,p:int64; function quick(x:int64):int64; var ...

  5. [swustoj 594] Maximum Tape Utilization Ratio

    Maximum Tape Utilization Ratio(0594) Time limit(ms): 1000 Memory limit(kb): 65535 Submission: 467 Ac ...

  6. DNS----域名解析系统

    DNS就是域名解析系统,它可以将IP转换成域名,也可以将域名转换成IP 1. 安装DNS服务       开始—〉设置—〉控制面板—〉添加/删除程序—〉添加/删除Windows组件—〉“网络服务”—〉 ...

  7. [TOP]疯狂的投资

    [TOP]疯狂的投资 这是罗辑思维一期<疯狂的投资>的节目笔记,这期主要是通过菲尔德铺设横跨大西洋的电缆的故事讲了创业者需要的特质和<二十一世纪资本论>的一个观念:随着自由市场 ...

  8. Java笔记(二十)……线程间通信

    概述 当需要多线程配合完成一项任务时,往往需要用到线程间通信,以确保任务的稳步快速运行 相关语句 wait():挂起线程,释放锁,相当于自动放弃了执行权限 notify():唤醒wait等待队列里的第 ...

  9. 五指cms安装说明

    1.五指cms目录结构说明 |-- coreframe                   #框架目录 |   |-- app                     #模块(应用程序)目录 |    ...

  10. (原)Struts 相关资源下载

    官网:http://struts.apache.org 点击[Download],进入页面如下,可以看到下载的资源: 点击[struts-2.3.20-all.zip],就能获取Struts2项目所有 ...