我正在编写代码来输入字符串并将其所有大写字母转换为小写字母,反之亦然:
#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;
}
问题是它总是返回所有小写字母的字符串,并且它们都不是大写字母。为什么呢?
答案 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)
因为在你转换成大写之后,你会转而转换回小写。
顺便说一句,为什么不使用toupper
和tolower
?
答案 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)完成的。