在C ++中将单个字符转换为小写-更低的返回整数

问题描述 投票:8回答:6

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

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

应在打印116时将T打印到控制台。

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

所以我的两个问题是:

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

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

  3. 我正在尝试将字符串转换为小写,并将其视为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 
    }
    

    int to_lower(int ch)的文档要求ch必须可以表示为unsigned char或必须等于EOF(这通常通常

    -1,但不要依赖于此)。

    从c标准库继承来的字符操作函数以int的形式工作并不罕见。这有两个原因:

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

  4. 为了一致性,这些函数需要处理EOF情况,出于明显的原因,该情况不能用char表示,因为这将意味着我们必须丢失字符的合法编码之一。] >

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

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

    例如:

  5. 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);
    
c++ string char lowercase tolower
6个回答
13
投票

那是因为有两个不同的tolower函数。您正在使用的是this one,它返回一个int。这就是为什么要打印116。这就是't'的ASCII值。如果要打印char,则只需将其投射回char

或者,您可以使用this one,它实际上返回您希望返回的类型:


2
投票

116确实是正确的值,但是,这只是std::cout如何处理整数,使用char(tolower(c))来获得所需结果的问题

std::cout << char(tolower('T')); // print it like this

2
投票

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

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

所以您最终可能会遇到这样的事情:


1
投票

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(这通常通常

-1,但不要依赖于此)。

从c标准库继承来的字符操作函数以int的形式工作并不罕见。这有两个原因:


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',然后将其重新映射为a小写字符。

char c = 'B';
c = c - 'A' + 'a'; // c is now 'b'
printf("c=%c\n", c);
© www.soinside.com 2019 - 2024. All rights reserved.