这个数组转换如何工作(使用字符串小写到大写)?

时间:2013-01-24 22:10:23

标签: c++ string uppercase lowercase

我让程序按预期工作,但任何人都可以解释 它是如何工作的吗?

#include <iostream>

using namespace std;

int main(void) {
    int exit;     
    string name;
    cin >> name;

    for (int i = 0; i < name.length(); i++) {
        // the line below is the one I don't understand 
        if ('a' <= name[i] && name[i] <= 'z') name[i] = char(((int)name[i]) - 32);
    }
    cout << name;
    cin >> exit;
    return 0;
 }

编辑:让我改写一下:

我不明白的是字符串到数组的交易是如何工作的,如: 'a'<= name[i]。具体到底是什么比较以及如何比较?

EDIT2 感谢快速反应的人,爱你们。我想通了。

5 个答案:

答案 0 :(得分:3)

这是一行:

 if('a'<=name[i] && name[i]<='z')name[i]=char(((int)name[i])-32);

细分:

 if( 'a'<=name[i] ) {
   if( name[i]<='z' ) {
     // name_int is a temporary, which the above code implicitly creates,
     // but doesn't give a name to:
     int name_int = name[i];
     name_int = name_int - 32;
     name[i] = char(name_int);
   }
 }

并注意32恰好等于您使用的字符编码中的'a'-'A'

(技术上name_int应该是int&&或某些,但不需要那么令人困惑。)

答案 1 :(得分:2)

我假设您在评论中的编辑中想知道[]如何应用于string对象。 []的运算符string被重载,以返回对所表示字符串的指定位置偏移处的字符的引用。不需要将string直接转换为数组。实现重载的代码很可能是遍历链表。这取决于string的实施方式。

答案 2 :(得分:1)

它假定ASCII字符格式从小写字母转换为大写,从原始ASCII值中减去32。这是因为大写的ASCII值小于小写的ASCII值,它是AaBb之间的常数差异,依此类推。

供参考:http://www.asciitable.com/

答案 3 :(得分:1)

'a' <= name[i] && name[i] <= 'z'

此行正在比较这两个字符的相应ASCII值。 ASCII中的'a'为97,'z'为122.如果name[i]'a''z'中的一个字符,则表达式返回true。这通常用于检查变量是否为字母。

答案 4 :(得分:0)

if ('a' <= name[i] && name[i] <= 'z')

char个对象是与int类似的数值。所以'a' <= name[i]只是测试'a'的数值是否小于或等于您正在检查的字符。结合name[i] <= 'z',您正在测试name[i]的数值是否介于'a''z'的值之间。现在,恰好将用于为char分配数值的最常见方案命名为“美国信息交换标准码”(ASCII),字母按顺序排列; 'a' + 1 = 'b''b' + 1 = 'c',依此类推。因此,弄清楚角色是否在'a''z'之间会告诉您它是否是小写字母。

name[i] = char(((int)name[i]) - 32);

一旦您知道char只是数值,您可以从我们在小学就读的算术的基本属性中推断'a' + ('A' - 'a')得到的值为'A'。此外,ASCII的大写字母排列与小写字母相似,因此'A' + 1 ='B', etc. So taking any char in the lower case alphabet and adding'A' - 'a'will result in the upper case version of that letter. In ASCII'一个' - 'a'`碰巧有-32的值。因此,取小写字母的数值,减去32,并得到大写字母的值。

为了比较,这里是不依赖于ASCII的代码版本:

auto l = std::locale();

if (std::islower(name[i], l))
    name[i] = std::tolower(name[i], l);