字符串大小写字母转换c 语言,towlower()

wint_t towlower ( wint_t wc );

towlower() 函数用来将大写字母转换为小写字母(针对宽字符)。

只有当参数 wc 是一个大写字母,并且存在对应的小写字母时,这种转换才会发生。

towlower() 是 tolower() 的宽字符版本。

参数

wc

要被转换的宽字符。它可以是一个有效的宽字符(被转换为 wint_t 类型),也可以是 WEOF(表示无效的宽字符)。

返回值

如果转换成功,那么返回与 wc 对应的小写字母;如果转换失败,那么直接返回 wc(值未变)。

注意,返回值为 wint_t 类型,你可能需要隐式或者显式地将它转换为 wchar_t 类型。

实例

将一个宽字符串中的大写字母转换为小写字母。

#include

#include

#include

int main ()

{

int i=0;

wchar_t str[] = L"C C++ Java Python GoLang\n";

wchar_t c;

while (str[i])

{

c = str[i];

putwchar (towlower(c));

i++;

}

return 0;

}

运行结果:

c c++ java python golang

关于大写字母和小写字母

人们通常认为只有"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"地域设置中,只有 iswlower() 或者 iswupper() 返回“真”的字母才会被视为字母;也就是说,一个字母要么是小写字母,要么是大写字母。

但是对于其它的地域设置,C语言并没有这种规定,一个字母可以是 iswlower() 或者 iswupper() 返回“真”的字符,也可以是被当前语言环境显式地(刻意地)指定为字母的字符,例如罗马数字ⅲⅵⅶⅸ和ⅢⅥⅦⅨ。但是有一个原则,被指定为字母的字符一定不能是 iswcntrl()、iswdigit()、iswpunct()、iswspace() 返回“真”的字符。

对于 towlower(),仅当有且只有一个对应的小写字母时,这种转换才能成功;如果没有对应的小写字母,或者有多个对应的小写字母,那么转换失败。转换成功返回对应的小写字母,转换失败直接返回 wc(值未变)。

【实例】在简体中文环境下检测大小写字母,并进行转换。

#include

#include

#include

int main ()

{

int i = 0;

wchar_t str[] = L"σωδБГЁāōūⅢⅥⅨⅲⅵⅸ";

wchar_t c;

setlocale(LC_ALL, "zh_CN.UTF-8"); //设置为简体中文,使用UTF-8编码

//在 Windows 下可以写作 setlocale(LC_ALL, ""); 或者 setlocale(LC_ALL, "chs");

//在 Linux 下可以写作 setlocale(LC_ALL, ""); 或者 setlocale(LC_ALL, "zh_CN.UTF-8");

//在 Mac OS 下可以写作 setlocale(LC_ALL, "zh_CN"); 或者 setlocale(LC_ALL, "zh_CN.UTF-8");

while (str[i])

{

c = str[i];

if (iswupper(c)) wprintf(L"%lc is upper, the lower is %lc\n", c, towlower(c));

else if(iswlower(c)) wprintf(L"%lc is lower, the upper is %lc\n", c, towupper(c));

else if(iswalpha(c)) wprintf(L"%lc is alphabetic\n", c);

else wprintf(L"%lc is a character\n", c);

i++;

}

return 0;

}

在 Windows 下的运行结果:

σ is lower, the upper is Σ

ω is lower, the upper is Ω

δ is lower, the upper is Δ

Б is upper, the lower is б

Г is upper, the lower is г

Ё is upper, the lower is ё

is lower, the upper is ā

is lower, the upper is ō

is lower, the upper is ū

Ⅲ is alphabetic

Ⅵ is alphabetic

Ⅸ is alphabetic

ⅲ is alphabetic

ⅵ is alphabetic

ⅸ is alphabetic

在 Linux 下的运行结果:

σ is lower, the upper is Σ

ω is lower, the upper is Ω

δ is lower, the upper is Δ

Б is upper, the lower is б

Г is upper, the lower is г

Ё is upper, the lower is ё

ā is lower, the upper is Ā

ō is lower, the upper is Ō

ū is lower, the upper is Ū

Ⅲ is upper, the lower is ⅲ

Ⅵ is upper, the lower is ⅵ

Ⅸ is upper, the lower is ⅸ

ⅲ is lower, the upper is Ⅲ

ⅵ is lower, the upper is Ⅵ

ⅸ is lower, the upper is Ⅸ

在 Mac OS 下的运行结果:

σ is lower, the upper is Σ

ω is lower, the upper is Ω

δ is lower, the upper is Δ

Б is upper, the lower is б

Г is upper, the lower is г

Ё is upper, the lower is ё

ā is lower, the upper is Ā

ō is lower, the upper is Ō

ū is lower, the upper is Ū

Ⅲ is a character

Ⅵ is a character

Ⅸ is a character

ⅲ is a character

ⅵ is a character

ⅸ is a character

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263713.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows与Linux之间海量文件的传输与Linux下大小写敏感问题

Windows与Linux之间海量文件的传输与Linux下大小写敏感问题 mount.cifs 支持通过网络文件系统挂载,不过需要安装cifs-utils,也可通过mount -t cifs挂载,详细的选项可参见man mount.cifs 1. 通过Windows共享文件夹 1.1 设置windows共享1.2 Lin…

Hashtable和HashMap的区别

HashTable的应用非常广泛,HashMap是新框架中用来代替HashTable的类,也就是说建议使用HashMap,不要使用HashTable。可能你觉得HashTable很好用,为什么不用呢?这里简单分析他们的区别。 1.HashTable的方法是同步的&#…

SQL解析之硬解析和软解析

当客户端进程,将SQL语句通过监听器发送到Oracle时, 会触发一个Server process生成,来对该客户进程服务。Server process得到SQL语句之后,对SQL语句进行Hash运算,然后根据Hash值到library cache中查找,如果存在&#xf…

ORA-00018: maximum number of sessions exceeded 超出最大会话数

ORA-00018: maximum number of sessions exceededORA-00018: 超出最大会话数 Cause: All session state objects are in use. 所有会话状态对象都在使用中。 Action: Increase the value of the SESSIONS initialization parameter. 增加会话初始化参数的…

对象关系映射(ORM)及代码生成器和插件C#源码(DBFrameworkV4.5.3)

1. ORM及代码生成器和插件C#源码(DBFrameworkV4.5.3) 一、使用对象关系映射组件Kenly.DBFramework.dll不用编写任何SQL或者存储过程即可实现下列功能:1、数据表、视图和存储过程与对象之间的转换。2、数据表、视图的自定义条件查询。3、数据表、视图的分页查询。4、…

念一城,安一世

时光飞快的流逝,岁月总是行行匆匆,随着迷茫的脚步渐行渐远,伴随着若有若无的孤单心事,猛然间离道阻挡在路中央,才诚惶诚恐的发现,留一份是匆忙,取一分就变成了离殇。在多愁中起步,在…

c语言如何读取mp3歌曲信息,VC中读取mp3文件信息的方法

标准格式的mp3文件中,都有一些自身描述的信息,比如歌曲名称、歌手、专辑名称等信息。这些信息都记录在mp3文件中,而且格式是固定的。那么,我们就可以用编程的方式来获取这些信息。其实说简单一点,就是VC文件读取的操作…

kvm虚拟机热迁移

1. 迁移介绍 迁移: 系统的迁移是指把源主机上的操作系统和应用程序移动到目的主机,并且能够在目的主机上正常运行。在没有虚拟机的时代,物理机之间的迁移依靠的是系统备份和恢复技术。在源主机上实时备份操作系统和应用程序的状态&#xff0c…

使用Backtrace函数打印调用栈 - Debug居家必备

glibc提供了backtrace这个库函数,可以用来打印call stack。比如我们可以在程序中注册常见的一些signal,比如SIGSEGMENT, SIGPIPE,然后在这些信号的回调函数中,利用backtrace打印出call stack,这样debug就非常的方便。 …

《C语言及程序设计》实践项目——三种循环语句

返回:贺老师课程教学链接 【项目1:利用循环求和】求1000以内所有偶数的和要求:请编出3个程序来,分别用三种循环语句完成,注意体会各种循环语句的执行过程及语法特点。[参考解答]【项目2:求阶乘】输入n&…

C语言数组学完学啥,我的c语言学习-数组专题

学到最后的数组专题了。数组数组,怎么着也要是一组数吧,对,数组是按顺序排列的一组同类型的数据构成的集合,用来保存大量同类型的相关数据。一 一维数组定义一个一维数组int a[5],表示有五个元素,a[0]、a[1]、a[2]…

通过图表简化sql语句的表关联

在之前的博文中分享过一个执行了两天的一条sql语句,走了两个大表的扫描,导致执行时间很长,通过简化sql做了不小的改进,今天我们来看看还可以做些什么。 上次简化后的语句如下:with tmp_logical_date as (SELECT logica…

输入三个数,按照由大到小的顺序输出

voidswap(int*p1,int*p2)/*实现两个数交换的函数*/{inttemp; temp*p1;*p1*p2;*p2temp;}voidexchange(int*p1,int*p2,int*p3)/*实现3个数两两比较、交换的函数*/{if(*p1<*p2) swap(p1,p2);/*比较第一个数和第二个数*/if(*p1<*p3) swap(p1,p3);/*比较第一个数和第三个数*/i…

android 自定义text,android – 使用自定义textSize实现自定义TextView

我已经实现了自定义TextView,然后我需要更改其文本大小以供将来使用.在那一步,我决定使用style.xml和attr.xml进行textSize自定义但是,当我的自定义布局膨胀时,我收到运行时错误.与我为了自定义而更改的部件相关的错误.这是我实现的代码片段.attr.xmlstyles.xml?attr/right_de…

[翻译] BFKit

BFKit BFKit is a collection of useful classes to develop Apps faster. BFKit是一个有用的工具集合&#xff0c;帮助你快速开发。 Installing and Usage Pod Pod安装 Create a Podfile in your project directoryWrite:platform :ios, 7.0xcodeproj Project.xcodeproj pod …

Camera Vision - video surveillance on C#

http://www.codeproject.com/KB/audio-video/cameraviewer.aspx 开发的资源 介绍&#xff1a;纵观当今的监控系统的发展趋势&#xff0c;能很容易发现基于IP的解决方案正在迅速的普及。有许多的制造商&#xff0c;提供广泛的IP视频射像和视频服务器&#xff0c;意味着个人的IP…

android 接口定义常量,Android开发笔记(5):常量的合理使用

今天&#xff0c;我们来聊一些“细枝末节”的问题——java中的常量。觉得很有意思&#xff0c;给大家分享一下&#xff1a;下面是我见过的几种常量定义操作&#xff1a;1.普通款&#xff1a;public class Constants {private Constants(){}public static final int MAX Intege…

mysql数据库操作手册

1 存储过程的写法 以下是一个带有入参的存储过程模板&#xff0c; #删除方案-存储过程 CREATE PROCEDURE procPersonAppointRecallPlanByPlanUuidDelete(in planUuid varchar(48)) BEGIN update PERSON_APPOINT_RECALL_DUTY set duty_status 2 WHERE duty_list_uuid in (sel…

如何写 go 代码 (How to Write Go Code 翻译)

目录 1. 写在前面的话2. 介绍3. 代码组织 3.1. 工作区3.2. GOPATH 环境变量3.3. Package 路径3.4. 第一个 GO 程序3.5. 第一个 GO 库3.6. Package name4. 测试5. 远程 package6. 下一步7. 获取帮助写在前面的话 本文为Go官方网站 How to Write Go Code 这篇文章的翻译, 水平有限…

Servlet规范定义的Servlet 生命周期

Servlet有良好的生存期的定义&#xff0c;包括如何加载、实例化、初始化、处理客户端请求以及如何被移除。这个生存期由javax.servlet.servlet接口的init,service和destroy方法表达。1、加载和实例化 容器负责加载和实例化一个Servlet。实例化和加载可以发生在引擎启动的时候&…