C语言tolower和toupper的用法

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

声明

以下是声明的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 以外的字符。

  • 14
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
C语言头文件包含了一些基础函数和常量的声明,以及定义一些数据类型和结构体。通过包含这些头文件,我们可以使用其中声明的函数和常量,以及使用定义的数据类型和结构体来编写C程序。 下面是一些常用的C语言头文件及其用法: 1. stdio.h:它包含了输入和输出函数的声明,例如printf和scanf,以及定义了一些常量,如NULL。 2. stdlib.h:它包含了一些标准库函数的声明,如内存管理函数(malloc和free)、随机数生成函数(rand)等。 3. string.h:它包含了一些字符串处理函数的声明,如字符串拷贝函数(strcpy)、字符串比较函数(strcmp)等。 4. math.h:它包含了一些数学函数的声明,如绝对值函数(abs)、平方根函数(sqrt)等。 5. ctype.h: 它包含了一些字符处理函数的声明,如判断字符是否为数字(isdigit)、大小写转换函数(touppertolower)等。 6. time.h: 它包含了与日期、时间相关的函数声明,如获取当前时间函数(time)、格式化输出时间函数(strftime)等。 这些头文件可以通过以下方式包含到C程序中:在程序开头使用#include语句加入头文件名称,如#include <stdio.h>。通过包含这些头文件,我们可以在程序中使用头文件中声明的函数和常量,以及使用定义的数据类型和结构体。 总之,C语言头文件是C编程的基础,其中包含了许多函数、常量和数据类型的声明,使用这些头文件可以方便地编写C程序并处理各种任务。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值