当前位置:网站首页>C陷阱与缺陷 第7章 可移植性缺陷 7.9 大小写转换
C陷阱与缺陷 第7章 可移植性缺陷 7.9 大小写转换
2022-08-01 21:00:00 【weixin_客子光阴】
大小写转换
#define toupper(c) ((c) + 'A' - 'a')
#define tolower(c) ((c) + 'a' - 'A')
这两个宏都依赖于特定实现中字符集的性质,即需要所有大写的小写字母与相应的小写字母之间的差值是一个常量。因为这些宏不能移植,且这些宏被封装在一个文件中,所以这个假设也并不那么危险。
这些宏的不足之处:如果输入的字母大小写不对,那么它们返回的就都是无用的垃圾信息。
这段代码无法工作:
int c;
while ((c = getchar()) != EOF) {
putchar(tolower(c));
}
应该写成这样才对:
int c;
while ((c = getchar()) != EOF) {
putchar(isupper(c) ? tolower(c) : c);
}
#define toupper(c) ((c) >= 'a' && (c) <= 'z' ? (c) + 'A' - 'a' : (c));
#define tolower(c) ((c) >= 'A' && (c) <= 'Z' ? (c) + 'a' - 'A' : (c));
可能每次宏调用,致使c被求值1到3次。例如遇到toupper(*p++)这样的表达式。
int toupper(int c) {
if (c >= 'a' && c <= 'z') {
return c + 'A' - 'a';
}
return c;
}
健壮性得到增强,代价是引入了函数调用的开销。
因此引入了新的宏名:
#define _toupper(c) ((c) + 'A' - 'a');
#define _tolower(c) ((c) + 'a' - 'A');
边栏推荐
- New graduate students, great experience in reading English literature, worthy of your collection
- 响应式织梦模板清洁服务类网站
- Multithreaded producers and consumers
- 网络安全与基础设施安全局(CISA):两国将在网络安全方面扩大合作
- Interview Blitz 70: What are sticky packs and half packs?How to deal with it?
- Protocol Buffer usage
- 30+的女性测试人面试经验分享
- 乐观锁批量跟新 纯SQL
- tiup mirror grant
- 【Social Media Marketing】How to know if your WhatsApp is blocked?
猜你喜欢
随机推荐
织梦通过数据库查询调用当前文章的留言
Godaddy域名解析速度慢问题以及如何使用DNSPod解析解决
列表页常见的 hook 封装
基于FPGA的任意字节数(单字节、多字节)的串口(UART)发送(含源码工程)
有点奇怪!访问目的网址,主机能容器却不行
StringTable详解 串池 性能调优 字符串拼接
扣减库存方案
ahooks 是怎么处理 DOM 的?
【Social Media Marketing】How to know if your WhatsApp is blocked?
用户身份标识与账号体系实践
乐观锁批量跟新 纯SQL
织梦模板加入php代码
通过这两个 hook 回顾 Set/Map 基础知识
JS提升:如何中断Promise的链式调用
Pytorch框架学习记录12——完整的模型训练套路
Multithreaded producers and consumers
C专家编程 第1章 C:穿越时空的迷雾 1.5 今日之ANSI C
案例:MySQL主从复制与读写分离
LinkedList source code sharing
Convolutional Neural Network (CNN) mnist Digit Recognition - Tensorflow