从大写转换为小写,反之亦然

时间:2011-09-15 04:57:41

标签: c++ string

我正在编写代码来输入字符串并将其所有大写字母转换为小写字母,反之亦然:

#include <iostream>
#include <string>
using namespace std;
int main(){
     string s;
     cout<<"enter the string :"<<endl;
     cin>>s;

     for (int i=0;i<s.length();i++){
        if ('a'<=s[i] && s[i]<='z'){
           s[i]=char(((int)s[i])-32);
        }

        if ('A'<=s[i] && s[i]<='Z'){
           s[i]=char(((int)s[i])+32);
        }
      }

     cout<<"modified string is  : "<<s<<endl;
     return 0;
}

问题是它总是返回所有小写字母的字符串,并且它们都不是大写字母。为什么呢?

6 个答案:

答案 0 :(得分:4)

您在第一个if语句中将所有小写转换为大写。但是,在第二个if语句中,更改为大写的相同字母将立即再次更改为小写。

你想要的是else if

答案 1 :(得分:3)

您的错误是在转换为上限后将字符串转换为小写。你可以像这样解决它:

if ('a'<=s[i] && s[i]<='z'){
    s[i]=char(((int)s[i])-32);
}
else if ('A'<=s[i] && s[i]<='Z'){
    s[i]=char(((int)s[i])+32);
}

这是一种更简洁的方法:

char InvertCase(char c)
{
    return islower(c) ? toupper(c) : tolower(c);
}

transform(s.begin(), s.end(), back_inserter(result), InvertCase);

答案 2 :(得分:1)

检查你的逻辑。如果字母是小写,则将其转换为大写。在那之后,如果字母是大写的(如果最初是小写的话),你将它转换为小写。

答案 3 :(得分:1)

因为在你转换成大写之后,你会转而转换回小写。

顺便说一句,为什么不使用touppertolower

答案 4 :(得分:0)

这是我从博客获得的代码,这可能有助于解决您的问题:

// Converting a string from lowercase to uppercase

#include <iostream>

using namespace std;

#include <cctype>    // prototypes for islower and toupper

void convertToUppercase( char * );

int main()
{
char phrase[] = "characters and $32.98";

cout << "The phrase before conversion is: " << phrase;
convertToUppercase( phrase );
cout << "\nThe phrase after conversion is:  "
    << phrase << endl;

return 0;  // indicates successful termination

} //结束主要

//将字符串转换为大写字母    void convertToUppercase(char * sPtr)    {     while(* sPtr!='\ 0'){//当前字符不是'\ 0'

    if ( islower( *sPtr ) )  // if character is lowercase,
        *sPtr = toupper( *sPtr );  // convert to uppercase

    ++sPtr;  // move sPtr to next character in string

} // end while

} // end function convertToUppercase

对于此代码的泄露,请访问以下链接:

http://www.programmingtunes.com/converting-a-string-from-lowercase-to-uppercase/

答案 5 :(得分:0)

我知道这个问题的目的是为了帮助调试你自己的程序,但我无法分享一个巧妙的技巧,它将帮助你以更优雅和简洁的方式完成你想要的东西:

int main()
{
    string s;
    cout<<"enter the string :"<<endl;
    cin>>s;
    for (int i=0;i<s.length();i++) s[i]^=32;
    cout<<"modified string is : "<<s<<endl;
    return 0;
}

这种方法基本上使用了这样一个事实,即字符的小写和大写对应的ASCII码的差异是32 = 2 ^ 5。因此转换归结为切换当前字符的第6个最低有效位,这是使用'^'(XOR)完成的。