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

converting from upper to lower case and vice-versa

本文关键字:反之亦然 转换      更新时间:2023-10-16

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

#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;
}

的问题是,它总是返回字符串与所有的小写字母,没有一个是大写的。为什么?

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

你需要的是一个else if

您的错误是在转换为大写之后将字符串转换为小写。你可以这样修改:

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);

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

因为在你转换成大写之后,你马上又转换回小写。

顺便说一下,为什么不用touppertolower呢?

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

// 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

}//end main

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

    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/

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

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位最低有效位,这是使用'^'(异或)来完成的。