苟哥的笔记本
首页
文章归档
关于
文章归档
关于
首页
编程
正文
C程序设计语言第2版习题3-4
苟哥
2019-06-19 AM
1100℃
0条
#### 问题描述 在数的反码表示中,上述的 itoa 函数不能处理最大的负数,即 n 等于-2^(字长-1) 的情况。请解释其原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。 ------ #### 问题分解 - 主函数main - 核心函数 itoa(n, s)。先来看原文的函数实现: - - ```C void itoa(int n, char s[]) { int i, sign; if((sign = n) < 0){ n = -n; } i = 0; do{ s[i++] = n % 10 + '0'; }while((n /= 10) > 0); if(sign < 0){ s[i++] = '-'; } s[i] = '\0'; reverse(s); } ``` 先来分析itoa函数为什么不能处理最大的负数,我们假设在int数据取值范围位-128 ~ 127 的机器上,当n = -128时,-n = 128 > 127,此时灾难发生了——得到的结果并不是我们想要的字符串。因此,问题处在 if((sign = n) < 0) 这句,那么我们只要将其改造一下即可。 ------ #### 代码实现 ```c #include
void itoa(int n, char s[]); void itoa2(int n, char s[]); void reverse(char s[]); int main() { int n = (~0U >> 1) + 1; char s[100], s1[100], s2[100]; printf("The input number is: %d\n", n); itoa(n, s); printf("The output string of itoa is: %s\n", s); itoa2(n, s1); printf("The output string of itoa2 is: %s\n", s1); return 0; } void itoa2(int n, char s[]) { int sign, i; sign = n; i = 0; do { s[i++] = ((sign < 0) ?-(n % 10) : n % 10) + '0'; //负数对10求余仍然是负数 } while ((n /= 10) != 0); if (sign < 0) s[i++] = '-'; s[i] = '\0'; reverse(s); } void itoa(int n, char s[]) { int i, sign; if((sign = n) < 0){ n = -n; } i = 0; do{ s[i++] = n % 10 + '0'; }while((n /= 10) > 0); if(sign < 0){ s[i++] = '-'; } s[i] = '\0'; reverse(s); } void reverse(char s[]) { int i, j, c; for (j = 0; s[j] != '\0'; j++) ; for (i = 0, j--; i < j; i++, j--) { c = s[i]; s[i] = s[j]; s[j] = c; } }#include
#define LEN 500 void expand(char s1[], char s2[]); int main() { char s1[LEN] = "-a-z0-9B-Y--", s2[LEN]; printf("The input string is: %s \n", s1); expand(s1, s2); printf("The output string is: %s \n", s2); return 0; } void expand(char s1[], char s2[]) { int i,j; for(i = 0, j = 0; s1[i] != '\0'; i++){ if(s1[i] == '-'){ if(i > 0){ if((s1[i - 1] >= 'a' && s1[i - 1] < 'z' || s1[i - 1] >= 'A' && s1[i - 1] < 'Z' || s1[i - 1] >= '0' && s1[i - 1] < '9' ) && (s1[i + 1] >= 'a' && s1[i + 1] <= 'z' || s1[i + 1] >= 'A' && s1[i + 1] <= 'Z' || s1[i + 1] >= '0' && s1[i + 1] <= '9' )){ while(s2[j - 1] < s1[i + 1] - 1){ s2[j] = s2[j - 1] + 1; j++; } continue; } } } s2[j++] = s1[i]; } s2[j] = '\0'; } ``` ------ #### 编译运行 ![3-4.png](http://images.kuryun.com/blog/typecho/3-4.png) 由运行结果可看出,原方法得到的结果不是预期的,改造后的得到了正确的结果。
标签:
C程序设计语言
,
算法
,
C语言
,
习题3-4
非特殊说明,本博所有文章均为博主原创。
如若转载,请注明出处:
http://www.i366211.com/archives/48/
上一篇
C程序设计语言第2版习题3-3
下一篇
C程序设计语言第2版习题3-5
取消回复
评论啦~
提交评论
栏目分类
软件安装
10
开发工具
8
算法
2
测试
1
架构
3
填坑记
2
开源
6
科普
6
私域
2
读书笔记
4
编程
48
运营
3
管理
1
标签云
算法
C程序设计语言
C语言
Java
mysql
PHP
ffmpeg
golang
VueJs
脚手架
VueJs实战项目
Intellij IDEA
Centos7
Hyperf
抖音运营
杰克韦尔奇
跌荡一百年
生成海量测试数据
企业管理
习题2-3
习题2-4
习题2-6
异常分类
File
习题2-7
习题2-8
习题2-9
习题3-3
习题3-4
习题3-5
友情链接
申请
SaaS引擎
机器人框架
京东捡漏