0

0

c++如何转换大小写字母_c++ toupper和tolower用法【常用】

冰火之心

冰火之心

发布时间:2026-02-09 10:52:03

|

768人浏览过

|

来源于php中文网

原创

toupper和tolower必须传入unsigned char或EOF,否则对有符号char负值行为未定义;正确做法是先static_cast再调用,返回int需转回char;不支持字符串批量转换和Unicode。

c++如何转换大小写字母_c++ toupper和tolower用法【常用】

直接用 touppertolower 会出错?先看字符类型

这两个函数在 中声明,但它们**只接受 int 类型输入,且要求值能映射为 unsigned char 或为 EOF**。如果你传入一个负值的 char(比如在某些平台 char 默认是 signed),行为未定义——常见表现是程序崩溃或返回乱码。

正确做法是显式转换:

char c = 'a';
char upper_c = static_cast(toupper(static_cast(c)));
  • 必须先转成 unsigned char,再进 toupper;否则对高位为 1 的字节(如非 ASCII 字符、locale 相关扩展字符)可能出错
  • 返回值是 int,需转回 char 才能赋值给字符变量
  • 不处理字符串,只处理单个字符;批量转换需循环

转换整个字符串时别直接套用 toupper

没有内置的“字符串大写”函数,std::string 也不提供 to_upper() 成员方法。常见错误是写成:

// ❌ 错误:toupper 不能作用于 std::string
std::string s = "hello";
s = toupper(s); // 编译失败

正确方式是遍历每个字符并就地修改:

立即学习C++免费学习笔记(深入)”;

OmniAudio
OmniAudio

OmniAudio 是一款通过 AI 支持将网页、Word 文档、Gmail 内容、文本片段、视频音频文件都转换为音频播客,并生成可在常见 Podcast ap

下载
for (char& c : s) {
    c = static_cast(toupper(static_cast(c)));
}
  • char& 引用避免拷贝,提高效率
  • 仍要保留 unsigned char 转换,尤其当字符串含 locale 特定字符时
  • 若需支持 Unicode(如 UTF-8),toupper 完全失效——它只工作于单字节编码,此时应改用 ICU、Boost.Locale 或 C++20 的 配合 facet

locale 感知的大小写转换怎么开?

默认的 toupper/tolower 是 C locale(即 ASCII 行为)。想支持德语 ß → SS、土耳其语 I/i 映射等,得用带 locale 的版本:std::toupperstd::tolower(在 中),配合 std::use_facet

const auto& facet = std::use_facet>(std::locale("de_DE.UTF-8"));
std::string s = "straße";
for (char& c : s) {
    c = facet.toupper(c);
}
  • 注意:不同平台对 locale 名称支持差异大,Linux 常用 de_DE.utf8,Windows 可能要用 German_Germany.1252
  • 这种转换仍限于单字节字符;UTF-8 多字节序列需先解码为 code point 再处理,std::ctype 不自动做这事
  • 性能比 C 版本低,频繁调用建议缓存 facet 引用

为什么 std::toupper 重载版本编译不过?

你可能见过这种写法:

using std::toupper;
char c = toupper('a', std::locale{}); // ✅ OK

但若漏掉 using 声明,或混用命名空间,容易触发 ADL(参数依赖查找)失败:

  • std::toupper('a', loc) 是标准写法,但必须包含 且确保 loc 类型正确
  • 如果传入的是 char 而不是 charT 模板参数匹配类型,编译器可能找不到重载
  • 更稳妥的做法是显式调用 facet 方法(如上一节),而非依赖重载解析

最常被忽略的一点:所有这些函数都不改变原始字符串长度,也不处理大小写映射中的一对多情况(例如德语 ß 转大写是 “SS”,但 toupper 对它返回原值——因为它不在 C locale 映射表里)。真要完整支持,得绕过标准库,用专用 Unicode 库。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

646

2023.08.02

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

444

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

213

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1517

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

634

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

800

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

772

2024.04.29

go语言字符串相关教程
go语言字符串相关教程

本专题整合了go语言字符串相关教程,阅读专题下面的文章了解更多详细内容。

181

2025.07.29

Golang处理数据库错误教程合集
Golang处理数据库错误教程合集

本专题整合了Golang数据库错误处理方法、技巧、管理策略相关内容,阅读专题下面的文章了解更多详细内容。

98

2026.02.06

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8.7万人学习

Git 教程
Git 教程

共21课时 | 3.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号