在 C++ 中将单个字符转换为小写 - tolower 返回一个整数

Convert a single character to lowercase in C++ - tolower is returning an integer

我正在尝试将字符串转换为小写,并将其视为 char* 并遍历每个索引。问题是我在网上读到的 tolower 函数实际上并没有将 char 转换为小写:它将 char 作为输入并 returning 一个整数。

cout << tolower('T') << endl;

在应该打印 T 时将 116 打印到控制台。

有没有更好的方法将字符串转换为小写? 我在网上看了看,大多数消息来源都说 "use tolower and iterate through the char array",这似乎对我不起作用。

所以我的两个问题是:

  1. 当我调用 tolower('T')[=18 时,tolower 函数使它成为 return 116 而不是 't' 我做错了什么=]

  2. 除了对每个字符使用 tolower 之外,是否有更好的方法在 C++ 中将字符串转换为小写?

降低是 int 所以它 returns int。如果你检查 #include <ctype> 你会看到定义是 int tolower ( int c ); 你可以使用循环遍历字符串并将每个字符更改为小写。例如

while (str[i]) // going trough string 
{
  c=str[i]; // ging c value of current char in string 
  putchar (tolower(c)); // changing to lower case      
  i++;  //incrementing 
}

那是因为有两个不同的 tolower 函数。您使用的是 this one,return 是 int。这就是它打印 116 的原因。那是 't' 的 ASCII 值。如果你想打印一个char,你可以把它转换回一个char

或者,您可以使用 this one,实际上 return 是您期望的类型 return:

std::cout << std::tolower('T', std::locale()); // prints t

回答你的第二个问题:

Are there better ways to convert a string to lowercase in C++ other than using tolower on each individual character?

没有。

116 确实是正确的值,但这只是 std::cout 如何处理整数的问题,请使用 char(tolower(c)) 实现您想要的结果

std::cout << char(tolower('T')); // print it like this

int to_lower(int ch) 的文档规定 ch 必须可以表示为 unsigned char 或必须等于 EOF(通常 -1,但不要依赖它)。

从 c 标准库继承的字符操作函数以整数形式工作的情况并不少见。有两个原因:

  1. 在早期的 C 语言中,所有参数都被提升为 int(函数原型不存在)。

  2. 为了保持一致性,这些函数需要处理 EOF 情况,由于显而易见的原因,这不能是 char 表示的值,因为那意味着我们必须失去其中之一字符的合法编码。

http://en.cppreference.com/w/cpp/string/byte/tolower

答案是在打印前将结果转换为字符。

例如:

std::cout << static_cast<char>(std::to_lower('A'));

它甚至比这更奇怪 - 它需要一个 int 和 returns 一个 int。参见 http://en.cppreference.com/w/cpp/string/byte/tolower

您需要确保传递给它的值可以表示为 unsigned char - 不允许负值,即使 char 已签名。

所以你最终可能会得到这样的结果:

char c = static_cast<char>(tolower(static_cast<unsigned char>('T')));

丑吧?但无论如何,一次转换一个字符是非常有限的。例如,尝试将“ß”转换为大写。

一般来说,将大写字符转换为小写字符,只需要在大写字符后面加上32即可,因为这个数字是大小写字符的ASCII码差值,例如'a'-'A'=97-67=32.

char c = 'B';
c += 32; // c is now 'b'
printf("c=%c\n", c);

另一种简单的方法是首先将大写字符映射到英文字母范围内的偏移量 0-25 即 'a' 是索引 '0' 而 'z' 是索引 ' 25',然后将其重新映射为小写字符。

char c = 'B';
c = c - 'A' + 'a'; // c is now 'b'
printf("c=%c\n", c);