13

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

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

116当它应该打印时打印到控制台T

有没有更好的方法将字符串转换为小写?我在网上环顾四周,大多数消息来源都说“使用tolower并遍历 char 数组”,这似乎对我不起作用。

所以我的两个问题是:

  1. 我在tolower调用时使它返回 116 而不是 't' 的函数做错了什么tolower('T')

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

4

6 回答 6

19

那是因为有两个不同的tolower功能。您正在使用的是this,它返回一个int. 这就是它打印 116 的原因。这是 ASCII 值't'。如果要打印 a char,只需将其转换回 a char

或者,您可以使用这个,它实际上返回您期望它返回的类型:

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

回答你的第二个问题:

除了在每个单独的字符上使用 tolower 之外,还有更好的方法在 C++ 中将字符串转换为小写吗?

没有。

于 2015-11-21T23:06:44.810 回答
3

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

std::cout << char(tolower('T')); // print it like this
于 2015-11-21T23:08:07.940 回答
2

它甚至比这更奇怪——它需要一个int并返回一个int。请参阅http://en.cppreference.com/w/cpp/string/byte/tolower

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

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

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

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

于 2015-11-21T23:10:58.397 回答
1

int to_lower(int ch)ch 必须可以表示为 anunsigned char或必须等于EOF通常为-1,但不要依赖于此)的授权文档。

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

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

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

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

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

例如:

std::cout << static_cast<char>(std::to_lower('A'));
于 2015-11-21T23:09:56.980 回答
1

降低是 int,所以它返回 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 
}
于 2015-11-21T23:05:36.107 回答
0

一般来说,要将大写字符转换为小写字符,您只需要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);
于 2020-05-25T15:11:46.677 回答