我试图将字符串转换为小写,并将其视为char *并迭代每个索引。问题是我在网上读到的tolower
函数实际上并没有将char转换为小写:它将char作为输入并返回一个整数。
cout << tolower('T') << endl;
当应该打印116
时,将T
打印到控制台。
我有更好的方法将字符串转换为小写吗?
我在网上浏览过,大多数消息来源都说&#34;使用tolower
并遍历char数组&#34; ,这似乎不是为我工作。
所以我的两个问题是:
tolower
功能使我返回116而不是&#39; t&#39;当我致电tolower('T')
除了在每个角色上使用tolower
之外,还有更好的方法可以将字符串转换为C ++中的小写字母吗?
答案 0 :(得分:10)
那是因为有两种不同的tolower
功能。您正在使用的是this one,它返回int
。这就是为什么它打印116.这是't'
的ASCII值。如果您要打印char
,只需将其转回char
。
或者,您可以使用this one,它实际上会返回您希望它返回的类型:
std::cout << std::tolower('T', std::locale()); // prints t
回答你的第二个问题:
除了在每个角色上使用tolower之外,是否有更好的方法将字符串转换为C ++中的小写?
不。
答案 1 :(得分:2)
116确实是正确的值,但这仅仅是std::cout
如何处理整数的问题,使用char(tolower(c))
来实现您想要的结果
std::cout << char(tolower('T')); // print it like this
答案 2 :(得分: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')));
丑陋不是吗?但无论如何,一次转换一个角色是非常有限的。例如,尝试将'ß'转换为大写。
答案 3 :(得分:1)
要降低为int,则返回int。如果检查#include <ctype>
,您将看到该定义为int tolower ( int c );
您可以使用循环来转换字符串并将每个字符更改为lowe case。例如
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
}
答案 4 :(得分:1)
int to_lower(int ch)
强制要求ch的文档必须可以表示为unsigned char
或必须等于EOF
(通常 -1,但是不要依赖那个。)
从c标准库继承的字符操作函数以int的形式工作并不罕见。这有两个原因:
在C的早期,所有参数都被提升为int(函数原型不存在)。
为了保持一致性,这些函数需要处理EOF情况,由于显而易见的原因,它不能成为char
可表示的值,因为这意味着我们必须丢失其中一个合法编码。一个角色。
http://en.cppreference.com/w/cpp/string/byte/tolower
答案是在打印前将结果转换为char。
e.g:
std::cout << static_cast<char>(std::to_lower('A'));
答案 5 :(得分: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);