C++ 在C+中将单个字符转换为小写+;-tolower正在返回一个整数
我试图将字符串转换为小写,并将其视为char*并遍历每个索引。问题是我在网上读到的C++ 在C+中将单个字符转换为小写+;-tolower正在返回一个整数,c++,string,char,lowercase,tolower,C++,String,Char,Lowercase,Tolower,我试图将字符串转换为小写,并将其视为char*并遍历每个索引。问题是我在网上读到的tolower函数实际上并没有将字符转换成小写:它将字符作为输入并返回一个整数 cout << tolower('T') << endl; coutTo lower是int,因此它返回int。如果您选中#include,您将看到定义为int tolower(int c)您可以使用循环遍历字符串,并将每个字符更改为小写。比如说 while (str[i]) // going trough s
tolower
函数实际上并没有将字符转换成小写:它将字符作为输入并返回一个整数
cout << tolower('T') << endl;
coutTo lower是int,因此它返回int。如果您选中#include
,您将看到定义为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
函数。您正在使用的是,它返回一个int
。这就是为什么它要打印116。这是't'
的ASCII值。如果要打印字符
,只需将其转换回字符
或者,您可以使用,它实际返回您希望它返回的类型:
std::cout << std::tolower('T', std::locale()); // prints t
std::cout116确实是正确的值,但是这只是std::cout
如何处理整数的问题,请使用char(tolower(c))
来获得所需的结果
std::cout << char(tolower('T')); // print it like this
std::coutint to_lower(int ch)
的文档要求ch必须可以表示为无符号字符,或者必须等于EOF
(通常为-1,但不依赖于此)
从c标准库继承的字符操作函数在INT方面工作并不少见。原因有两个:
在C语言的早期,所有参数都被提升为int(函数原型不存在)
为了保持一致性,这些函数需要处理EOF大小写,由于明显的原因,EOF大小写不能是用char
表示的值,因为这意味着我们必须丢失字符的一个合法编码
char c = 'B';
c = c - 'A' + 'a'; // c is now 'b'
printf("c=%c\n", c);
答案是在打印前将结果强制转换为字符
e、 g:
std::cout甚至比这更奇怪-它接受int
并返回int
。看
您需要确保传递给它的值可以表示为无符号字符
——即使字符
有符号,也不允许出现负值
所以你可能会得到这样的结果:
char c = static_cast<char>(tolower(static_cast<unsigned char>('T')));
charc=static_cast(tolower(static_cast('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);
或者您可以将int
转换为char
。更好的方法是使用ICU:实际上,还有其他方法可以将字符串转换为小写。例如,ASCII“T”和“T”之间的差异为0x20。因此,如果一个ORs或将0x20添加到大写ASCII字母,则该字母将变为小写。同样,ASCII字母也是如此。如果需要其他代码页,此方法将不起作用。这是否“最佳”取决于环境和项目。