《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];
}
《c和指针》1.5编程练习问题的更多相关文章
- 华为面试题——一道关于指针方面的编程题(C/C++)
int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素 ...
- C++多线程编程入门之经典实例
多线程在编程中有相当重要的地位,我们在实际开发时或者找工作面试时总能遇到多线程的问题,对多线程的理解程度从一个侧面反映了程序员的编程水平. 其实C++语言本身并没有提供多线程机制,但Windows系统 ...
- C#不安全代码和指针
从通常情况下来看,为了保持类型安全,默认情况C# 不支持指针算法. 不过,当你需要使用指针的时候,请通过使用 unsafe 关键字,可以定义可使用指针的不安全上下文. 有关指针的更多信息,请参见主题指 ...
- (转) 谈C/C++指针精髓
原文:http://www.cnblogs.com/madengwei/archive/2008/02/18/1072410.html [摘要] 指针是C和C++语言编程中最重要的概念之一, ...
- Linux 编程学习笔记----ANSI C 文件I/O管理
转载请注明出处:http://blog.csdn.net/suool/article/details/38129201 问题引入 文件的种类 依据数据存储的方式不同,能够将文件分为文本文件和二进制文件 ...
- C语言指针操作
欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/pointer-manipulation. ...
- [C++]指针与多级指针(图解)
声明:如需引用或者摘抄本博文源码或者其文章的,请在显著处注明,来源于本博文/作者,以示尊重劳动成果,助力开源精神.也欢迎大家一起探讨,交流,以共同进步- 0.0 演示: /* @author:John ...
- 来自Unix/Linux的编程启发录
本篇文章已授权微信公众号 guolin_blog (郭霖)独家公布重点内容 2017年第一篇文章,祝各位好友新年快乐. 年前因为不小心坐到了自己左手大拇指导致轻微的骨裂,没有按时更新,实在是羞愧.今年 ...
- 第22课 weak_ptr弱引用智能指针
一. weak_ptr的概况 (一)weak_ptr的创建 1. 直接初始化:weak_ptr<T> wp(sp); //其中sp为shared_ptr类型 2. 赋值: wp1 = sp ...
- 少儿编程|Scratch编程教程系列合集,总有一款适合你
如果觉得资源不错,友情转发,贵在分享!!! 少儿编程Scratch: 少儿编程Scratch第一讲:Scratch完美的初体验少儿编程Scratch第二讲:奇妙的接球小游戏少儿编程Scratch第三讲 ...
随机推荐
- Android开发之permission
permission,Android权限系统. 基本上都是在manifest.xml文件中进行操作. 1.申请使用权限 申请使用权限使用标记:<uses-permission /> 比如申 ...
- find 日常使用
find 查找文件 fidn 目录 参数 find ~ -type f find /log -name "root.log" find . -type f -exec ls -l ...
- ☀【组件】加载 load
Bear / js / utils / load.js 动态修改script标签中的src属性存在的问题 javascript创建css.js,onload触发callback兼容主流浏览器的实现 各 ...
- MyEclipse常用操作技巧
1.源码和帮助文档的的关连 下面以关联struts2-core-2.3.14.2.jar源代码为例: 如下为示意图 2.拷贝项目的时候,要注意 将项目的web-root fold改成更新后的名字项目名 ...
- MVC系统过滤器、自定义过滤器
一.系统过滤器使用说明 1.OutputCache过滤器 OutputCache过滤器用于缓存你查询结果,这样可以提高用户体验,也可以减少查询次数.它有以下属性: Duration:缓存的时间,以秒为 ...
- 如何使一个网络下的2台路由器都可以dhcp上网
设备:2台路由器,网线若干 首先,设置好一个路由器,让它可以拨号上网.网关设置为192.168.1.1,子网掩码为255.255.255.0,dns为61.177.7.1 然后,设置第二台路由器.设置 ...
- 用生活例子来解释Java synchronized块
今天满世界的微信小程序的新闻,大家都说对于Android原生程序有构成危险了,我也不想了,以后的事谁知道呢, 我还是好好执行一下今年的计划吧. 项目刚刚上线,最近没啥事,我一直感觉自己的Java基础 ...
- 待修改 nyoj 412 又是一个遗留问题
测试的数据都正确啊,跟别人正确代码也对比了一下,一直wrong ans,这道题是搞不定了,思路是这样的,一个int 的数, 例如 一个数的二进制是1001100,那么大于这个数的最小的有相同个数1的数 ...
- HDU FatMouse's Speed 基本DP
题意:要求找到的体重递增,速度递减的老鼠,并且输出最长的长度数,而且输出各自的序列数.Special Judge 思路:先按体重由小到大排序,再找最长速度递减序列. 转移方程:mou[i].w> ...
- 决策树及其python实现
剪枝 由于悲观错误剪枝 PEP (Pessimistic Error Pruning).代价-复杂度剪枝 CCP (Cost-Complexity Pruning).基于错误剪枝 EBP (Error ...