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

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

我试图将字符串转换为小写,并将其视为char*并遍历每个索引。问题是我在网上读到的
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字母也是如此。如果需要其他代码页,此方法将不起作用。这是否“最佳”取决于环境和项目。