那是因为有两个不同的tolower
函数。您正在使用的是this one,它返回一个int
。这就是为什么要打印116。这就是't'
的ASCII值。如果要打印char
,则只需将其投射回char
。
或者,您可以使用this one,它实际上返回您希望返回的类型:
我正在尝试将字符串转换为小写,并将其视为char *并遍历每个索引。问题是我在线阅读的tolower
函数实际上并没有将char转换为小写字母:它将char作为输入并返回一个整数。
cout << tolower('T') << endl;
应在打印116
时将T
打印到控制台。
我是否有更好的方法将字符串转换为小写?我在网上四处看看,大多数消息来源说“使用tolower
并遍历char数组”,这似乎对我不起作用。
所以我的两个问题是:
tolower
函数在做什么,使我在调用tolower('T')
时返回116而不是't'。
除了在每个单独的字符上使用tolower
之外,还有更好的方法将C ++中的字符串转换为小写吗?] >>
我正在尝试将字符串转换为小写,并将其视为char *并遍历每个索引。问题是我在网上阅读的tolower函数实际上并没有转换...
那是因为有两个不同的tolower
函数。您正在使用的是this one,它返回一个int
。这就是为什么要打印116。这就是't'
的ASCII值。如果要打印char
,则只需将其投射回char
。
或者,您可以使用this one,它实际上返回您希望返回的类型:
std::cout << std::tolower('T', std::locale()); // prints t
回答您的第二个问题:
除了在每个单独的字符上使用lower之外,还有其他更好的方法将字符串转换为C ++中的小写吗?
不。
116确实是正确的值,但是,这只是
std::cout
如何处理整数,使用char(tolower(c))
来获得所需结果的问题std::cout << char(tolower('T')); // print it like this
甚至比这更奇怪-它需要一个
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')));
不是很丑吗?但是无论如何一次转换一个字符是非常有限的。例如,尝试将“ß”转换为大写。
Tolow为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 }
-1,但不要依赖于此)。
int to_lower(int ch)
的文档要求ch必须可以表示为unsigned char
或必须等于EOF
(这通常通常从c标准库继承来的字符操作函数以int的形式工作并不罕见。这有两个原因:
在C的早期,所有参数都被提升为int(函数原型不存在。)>]
为了一致性,这些函数需要处理EOF情况,出于明显的原因,该情况不能用
char
表示,因为这将意味着我们必须丢失字符的合法编码之一。] >http://en.cppreference.com/w/cpp/string/byte/tolower
答案是在打印之前将结果转换为char。
例如:
std::cout << static_cast<char>(std::to_lower('A'));
通常来说,要将大写字母转换为小写字母,您只需要在大写字母上添加
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',然后将其重新映射为a小写字符。char c = 'B'; c = c - 'A' + 'a'; // c is now 'b' printf("c=%c\n", c);
116确实是正确的值,但是,这只是std::cout
如何处理整数,使用char(tolower(c))
来获得所需结果的问题
std::cout << char(tolower('T')); // print it like this
甚至比这更奇怪-它需要一个int
并返回一个int
。参见http://en.cppreference.com/w/cpp/string/byte/tolower。
[您需要确保传递的值可以表示为unsigned char
-不允许负值,即使char
已签名。
所以您最终可能会遇到这样的事情:
Tolow为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
}
int to_lower(int ch)
的文档要求ch必须可以表示为unsigned char
或必须等于EOF
(这通常通常
从c标准库继承来的字符操作函数以int的形式工作并不罕见。这有两个原因:
通常来说,要将大写字母转换为小写字母,您只需要在大写字母上添加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',然后将其重新映射为a小写字符。char c = 'B'; c = c - 'A' + 'a'; // c is now 'b' printf("c=%c\n", c);