c语言程序实现大小写的转换(C语言字符大小写转换函数tolower和toupper)

作用:C库函数 int tolower(int c)转换给定的字母为小写,今天小编就来聊一聊关于c语言程序实现大小写的转换?接下来我们就一起去研究一下吧!

c语言程序实现大小写的转换(C语言字符大小写转换函数tolower和toupper)

c语言程序实现大小写的转换

作用:

C库函数 int tolower(int c)转换给定的字母为小写。

C库函数 int toupper(int c)转换给定的字母为大写。

声明

以下是声明的tolower()函数。

int tolower(int c); int toupper(int c);

参数
  • 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=ach=B

关于大小写字母

人们通常认为只有"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 以外的字符。

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页