不使用toUpper(),toLower(),length(),at()或[] - 转换"嘿!!那里&#34!;到了" hEy !!有&#34!;

时间:2016-10-03 00:24:28

标签: c++ ascii

void crazyCaps(string& str){
size_t i = 0;
size_t strLength = str.length();  // this line violates the rule as mentioned in the title

while (i < strLength) {
    if (i % 2 == 0) {
        if (str[i] >= 'A' && str[i] <= 'Z')   // this line violates the rule as mentioned in the title
            str[i] += 32;
    }
    else {
        if (str[i] >= 'a' && str[i] <= 'z') 
            str[i] -= 32;
    }
    i++;
}
  

我的意见:&#34;嘿!! THERE&#34;!

     

我的输出:&#34; hEy !!有&#34!;

我可以在不使用toUpper()和toLower()函数的情况下将字符转换为大写和小写。但是,我还在使用length()和[]。所以我的问题是你如何转换&#34;嘿!!那里&#34!;到了&#34; hEy !!有&#34!;不使用length()或[]和toUpper()或toLower()。

1 个答案:

答案 0 :(得分:-1)

str[i]相当于*(str + i)。在内部,编译器将str[i]转换为*(str + i)
这意味着,str[i] = *(str + i) = i[str]

此外,字符串始终以\0(空字符)结尾。使用这两个事实,你可以构造这样的东西:

int i = 0
while(*(str + i) != '\0') {
    //change the case by adding or subtracting 32
    i++;
}

编辑:字符串,我的意思是常规的C字符串而不是std::string