tolower 是什么?
tolower 是 C 标准库中的一个函数,它的主要作用是将大写字母转换为对应的小写字母。

(图片来源网络,侵删)
- 如果传入的字符已经是一个小写字母或者根本不是字母,
tolower会原样返回这个字符。 - 它只会处理 A-Z (ASCII 码 65-90) 范围内的字符。
函数原型
要使用 tolower,你需要包含头文件 <ctype.h>。
#include <ctype.h> int tolower(int c);
参数说明:
c: 这是一个int类型的参数,虽然我们通常用它来传递一个char,但标准规定参数类型是int,这允许你传递char的所有可能值(包括 EOF - End of File)。- 返回值: 转换后的小写字母(也是一个
int类型)。c不是大写字母,则返回c本身。
如何使用(代码示例)
下面通过几个例子来演示 tolower 的常见用法。
示例 1:基本转换
这是最直接的用法,将单个大写字母转换为小写。

(图片来源网络,侵删)
#include <stdio.h>
#include <ctype.h>
int main() {
char upper_char = 'A';
char lower_char = tolower(upper_char); // 将 'A' 转换为 'a'
printf("Original char: %c\n", upper_char); // 输出: Original char: A
printf("Converted char: %c\n", lower_char); // 输出: Converted char: a
// 传入小写字母,原样返回
char already_lower = 'b';
printf("Already lower: %c\n", tolower(already_lower)); // 输出: Already lower: b
// 传入非字母字符,原样返回
char not_alpha = '1';
printf("Not alpha: %c\n", tolower(not_alpha)); // 输出: Not alpha: 1
return 0;
}
示例 2:处理整个字符串(最常见的用法)
在实际编程中,我们经常需要将一个字符串中的所有大写字母都转换为小写,这通常通过循环遍历字符串的每个字符来实现。
#include <stdio.h>
#include <ctype.h> // 必须包含
// 将字符串 s 中的所有大写字母转换为小写
void to_lower_string(char s[]) {
int i = 0;
// 遍历字符串,直到遇到字符串结束符 '\0'
while (s[i] != '\0') {
// 对每个字符应用 tolower
s[i] = tolower(s[i]);
i++;
}
}
int main() {
char my_string[] = "Hello, World! 123";
printf("Original string: %s\n", my_string); // 输出: Original string: Hello, World! 123
to_lower_string(my_string);
printf("Lowercase string: %s\n", my_string); // 输出: Lowercase string: hello, world! 123
return 0;
}
代码解释:
- 我们定义了一个函数
to_lower_string,它接收一个字符数组(即字符串)作为参数。 while (s[i] != '\0')是遍历字符串的标准方式,'\0'是字符串的结束标志。- 在循环内部,
s[i] = tolower(s[i]);对当前字符进行转换,并将结果存回原位置。 - 在
main函数中,我们定义了一个字符串,调用to_lower_string函数,然后打印转换后的结果。
重要注意事项
1 必须包含 <ctype.h> 头文件
如果你忘记包含 #include <ctype.h>,编译器会不认识 tolower 函数,导致编译错误。
2 tolower 的行为依赖于当前的区域设置 (Locale)
这是一个非常关键但容易被忽略的点。
- 什么是 Locale? Locale 是一组用户语言和文化偏好的设置,它决定了程序如何处理字符、日期、时间、货币等。
- 影响:
tolower的转换规则是由当前 Locale 决定的,对于标准的 "C" Locale(或 "POSIX" Locale),tolower只会转换 A-Z,如果系统设置了其他 Locale(土耳其语tr_TR),tolower的行为可能会不同。
示例:土耳其语的特殊情况
在土耳其语中,大写字母 'I' 的小写形式是 'ı'(不带点),而小写字母 'i' 的大写形式是 'İ'(带点)。
#include <stdio.h>
#include <ctype.h>
#include <locale.h> // 用于设置区域
int main() {
// 设置区域为土耳其语
setlocale(LC_ALL, "tr_TR.UTF-8"); // 在 Linux/macOS 上
// setlocale(LC_ALL, "Turkish"); // 在 Windows 上
char c = 'I';
printf("In Turkish locale, 'I' becomes: %c\n", tolower(c)); // 输出: ı
// 重置回标准的 C 区域
setlocale(LC_ALL, "C");
c = 'I';
printf("In C locale, 'I' becomes: %c\n", tolower(c)); // 输出: i
return 0;
}
如果你的程序需要处理国际化文本(i18n),并且必须遵循特定语言的转换规则,那么必须在使用 tolower 之前正确设置 locale,对于大多数简单的、不考虑国际化(i18n)的程序,使用默认的 "C" Locale 就足够了。
3 参数是 int 类型
虽然你通常传入 char,但函数签名是 int tolower(int c),这可以确保所有 char 值(包括 EOF)都能被正确处理,不会因为符号扩展导致问题。
与 toupper 的对比
tolower 有一个对应的函数 toupper,作用相反。
| 函数 | 功能 | 示例 ('a') |
示例 ('A') |
|---|---|---|---|
tolower |
转换为小写 | 'a' (原样返回) |
'a' (转换) |
toupper |
转换为大写 | 'A' (转换) |
'A' (原样返回) |
#include <stdio.h>
#include <ctype.h>
int main() {
char c1 = 'A';
char c2 = 'a';
printf("'%c' to lower is '%c'\n", c1, tolower(c1)); // 'A' to lower is 'a'
printf("'%c' to upper is '%c'\n", c2, toupper(c2)); // 'a' to upper is 'A'
return 0;
}
- 做什么:
tolower将大写字母转为小写,其他字符不变。 - 怎么用:
#include <ctype.h>,tolower(your_char)。 - 常见场景:循环遍历字符串,对每个字符调用
tolower。 - 关键点:
- 别忘了包含
<ctype.h>。 - 它的行为受
locale影响,国际化程序需要注意。 - 它有对应的
toupper函数。
- 别忘了包含
