C语言tolower和toupper的用法
声明
以下是声明的tolower()函数。
int tolower(int c);
int toupper(int c);
参数
c -- 这是字母转换为小写(或者大写)。
头文件:
#include <ctype.h>
例子如下:
#include <stdio.h>
#include <ctype.h>int main(void)
{char ch = 'A';ch = tolower(ch);printf("ch=%c\n",ch);ch = 'b';ch = toupper(ch);printf("ch=%c\n",ch);return 0;
}
输出结果:
ch=a
ch=B
扩展:为什么形参是int类型为不是char类型?
以下内容参考:http://c.biancheng.net/ref/tolower.html
关于大小写字母
人们通常认为只有"acb...xyz"
才是小写字母,只有"ABC...XYZ"
才是大写字母,其实这是不对的。大小写字母并不是固定的,不同的语言文化可能会包含不同的大小写字母,例如在“简体中文”环境中,西里尔文БГЁ
、希腊文ΣΩΔΨΦ
(数学物理公式中常用希腊字母)等都将成为大写字母,它们对应的小写字母是бгё - σωδψφ
。
我们可以通过 setlocale() 函数改变程序的地域设置,让程序使用不同的字符集,从而支持不同的语言文化。
在默认的地域设置(默认为"C"
)中,C语言通常使用 ASCII 编码,能较好地支持英文,此时的
大写字母包括:A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
小写字母包括:a b c d e f g h i j k l m n o p q r s t u v w x y z
在其它地域设置中,可能会使用 GBK(简体中文)、BIG5(繁体中文)、Shift-JIS(日文)、Unicode(世界统一码) 等更加复杂的编码,它们包含了更多的大小写字母。
也就是说,一个字符是否是大写字母或者小写字母和程序的地域设置有关,不同的地域设置会包含不同的大小写字母。
字母一定要区分大小写吗?
我们通常认为,一个字母要么是小写字母,要么是大写字母;并且一个小写字母必定对应一个大写字母,反之亦然。这种说法虽然适用于默认的地域设置(默认为"C"
),但是并不一定适用于其它的地域设置。
以 Windows 下的“简体中文”环境为例,拼音āōūǖ
都将成为小写字母,但是它们没有对应的大写字母。Windows 下的“简体中文”环境使用 GBK 编码,该编码并没有包含ĀŌŪǕ
这些大写形式。
罗马数字ⅲⅵⅶⅸ
和ⅢⅥⅦⅨ
也会被视为字母,并且从视觉上看起来是大小写对应的。其实不然,对于 Windows 来说,ⅲⅵⅶⅸ
和ⅢⅥⅦⅨ
都仅仅是字母而已,并没有所谓的“大小写”形式;换句话说,它们既不是大写字母,也不是小写字母,仅仅是字母而已。
以上说法仅适用于 Windows,在 Linux 和 Mac OS 下使用“简体中文”情况会有所不同:
āōūǖ
会有对应的大写字母ĀŌŪǕ
,因为 Linux 和 Mac OS 下的“简体中文”使用 Unicode 字符集(严格来说是 UTF-8 编码),该字符集包含了世界上所有的字符。- 在 Mac OS 下,
ⅲⅵⅶⅸ
和ⅢⅥⅦⅨ
根本不会被视为字母;在 Linux 下,ⅲⅵⅶⅸ
被视为小写字母,ⅢⅥⅦⅨ
被视为大写字母。
站在专业角度看问题
C语言标准规定,在默认的"C"
地域设置中,只有 islower() 或者 isupper() 返回“真”的字母才会被视为字母;也就是说,一个字母要么是小写字母,要么是大写字母。
但是对于其它的地域设置,C语言并没有这种规定,一个字母可以是 islower() 或者 isupper() 返回“真”的字符,也可以是被当前语言环境显式地(刻意地)指定为字母的字符,例如罗马数字ⅲⅵⅶⅸ
和ⅢⅥⅦⅨ
。但是有一个原则,被指定为字母的字符一定不能是 iscntrl()、isdigit()、ispunct()、isspace() 返回“真”的字符。
对于 tolower(),仅当有且只有一个对应的小写字母时,这种转换才能成功;如果没有对应的小写字母,或者有多个对应的小写字母,那么转换失败。转换成功返回对应的小写字母,转换失败直接返回 c(值未变)。
拓展阅读
我们在编写C语言程序时,通常使用 char 类型来表示一个字符,而 tolower() 的参数却是 int 类型,这是为什么呢?请猛击《为什么<ctype.h>中的函数参数都是int类型》一文了解详情。
以下内容参考:http://c.biancheng.net/ref/4.html
为什么<ctype.h>中的函数参数都是int类型
<ctype.h> 头文件中包含了一系列与字符处理有关的函数,这些函数有一个共同特点:它们的参数都是 int 类型。例如:
- int isalnum ( int c );
- int islower ( int c );
- int isupper ( int c );
- int tolower ( int c );
- int toupper ( int c );
为什么这些函数的参数都是 int 类型?
在编写C语言程序时,我们通常使用char
或者unsigned char
来表示一个字符,而 <ctype.h> 所包含的字符处理函数的参数都是 int 类型,这是为什么呢?
<ctype.h> 中的字符处理函数除了能够接收 unsigned char 范围内的“普通”字符,还必须能够接收一个无效的字符——EOF。
EOF 除了可以表示文件结尾,还可以表示一个无效的字符。
也就是说,参数要接收的数值范围大于 char 所能表示的数值范围,所以参数的类型必须大于char。大于 char 的类型有 short、int、long 等,C语言标准干脆规定就用 int 吧,这样绰绰有余,弹性很大。
char 可以隐式地转换为 int,我们在给字符处理函数传参时不需要再进行显式的(强制的)类型转换了。
关于 char 以外的字符
C语言标准规定,<ctype.h> 中的字符处理函数至少要能够处理 unsigned char 范围以内的字符,范围以外的字符不做要求,各个组织在实现标准库时可以自由发挥。
这就导致不同的标准库之间存在差异,例如在 Visual Studio 中处理 unsigned char 以外的字符会导致断言失败,程序终止执行;而在 Xcode(基于LLVM编译器)中可以顺利处理 unsigned char 以外的字符,比如汉字"中国我爱你!"
。
在 Debug 模式下断言才会生效。
为了让代码更有兼容性,建议使用 <wctype.h> 中的宽字符处理函数来处理 unsigned char 以外的字符。
C语言tolower和toupper的用法相关推荐
- C语言函数:tolower()、toupper字符大小写转换函数。
C语言函数:tolower().toupper字符大小写转换函数. int toupper( int c) int tolower( int c) tolower():将字母转为小写. toupper ...
- 慎用ToLower和ToUpper,小心把你的系统给拖垮了
不知道何时开始,很多程序员喜欢用ToLower,ToUpper去实现忽略大小写模式的字符串相等性比较,有可能这个习惯是从别的语言引进的,大胆猜测下是JS,为了不引起争论,我指的JS是技师的意思~ 一: ...
- 【C 语言】数组 ( 指针数组用法 | 自我结束能力 )
文章目录 一.指针数组用法 ( 自我结束能力 ) 二.完整代码示例 一.指针数组用法 ( 自我结束能力 ) 在上一篇博客 [C 语言]数组 ( 指针数组用法 | 命令行参数处理 ) 中的主函数中的 c ...
- C语言之 scanf() 函数的用法
C语言之 scanf() 函数的用法 输入一个正整数,对这个正整数中的各位进行比较,输出最大那个数 比如: 输入:123456789 输出:9 #include <stdio.h>int ...
- C语言malloc,free的用法
该博文为原创文章,未经博主同意不得转载,如同意转载请注明博文出处 本文章博客地址:https://cplusplus.blog.csdn.net/article/details/105163414 C ...
- C语言tolower函数介绍、示例和实现
文章目录 1.包含头文件 2.函数声明 3.功能说明 4.示例 5.自定义的tolower函数的实现方法 6.获取视频教程 7.版权声明 C语言tolower函数用于把大写字母转换为小写字母. 在本文 ...
- java实现c语言的函数_C语言tolower函数介绍、示例和实现
C语言tolower函数用于把大写字母转换为小写字母. 在本文中,我们先来介绍tolower函数的使用方法,然后编写一个自定义的_tolower函数,实现与tolower函数相同的功能. 1.包含头文 ...
- 关于C语言编程中include的用法
关于C语言编程中include的用法 1 iostream与iostream.h的区别: #include <iostream.h> // 这个就是1998年标准化以后的标准头文件 #in ...
- C语言中图形函数及其用法
C语言中图形函数及其用法 Turbo C 2.0具有丰富的图形功能,它提供了70多个图形函数.在这里只介绍最常用的一部分,其余的图形函数及用法可参阅相关书籍.图形函数均在头文件"graph ...
- c语言中的static和extern,C语言extern与static的用法,及extern “c
C语言extern与static的用法,及extern "c " 一.c语言static与extern的用法 1.static和extern: 大工程下我们会碰到很多源文件. 文件 ...
最新文章
- 机器学习--多标签softmax + cross-entropy交叉熵损失函数详解及反向传播中的梯度求导
- 1.5 @SafeVarargs注解
- linux下源码安装cmake
- delphi 7 学习步骤
- 铁乐学Python_day09_函数
- MySQL高级知识(四)——Explain
- 马化腾评 ofo 溃败原因;京东到家否认裁员;王兴质押全部摩拜股权 | 极客头条...
- 运维工程师面试题 ----- 系统网络类
- 表结构设计器(EZDML)1.98版公布
- 大数据技术架构都有哪些变化
- 基于jquery鼠标点击图片翻开切换效果
- 从Windows 1.0到Vista启动画面回顾
- [算法竞赛入门]WERTYU
- 第 3 讲 三维空间刚体运动
- 39、C++11多线程及其学习笔记
- MStar点屏(LVDS接口屏)
- uint16 累加_在一个驱动程序中看到uint16,uint32,unit8,int8是什么意思?有何作用?...
- 小时候的蓝精灵,大家还记得木有哇?
- 混合个人训练第四十六场(A,B题解) A	数论线代全家桶 (all) B: 看星星 (stars)
- linux部署的Oracle 11G数据库创建实例
热门文章
- mysql数据库表中重命名语句_mysql数据库重命名
- openwrt之mwan3负载均衡·多线多拨
- ai文字渐变_AI制作渐变色立体文字效果
- 【搬运】罗霸道网文写作经验分享
- strtolower()和strtoupper()中文乱码问题
- 重庆云阳2021云中高考成绩查询,2021年云阳县高考状元是谁及其成绩名单
- 2018-2019-2 网络对抗技术 20165322 Exp4 恶意代码分析
- spark MLlib 概念 2:Stratified sampling 层次抽样
- ubuntu10.10下smbd服务配置——实现主机WinXP与虚拟机Ubuntu10.10共享
- 字符串(蓝桥杯模拟赛)