从大写转换为小写,反之亦然
converting from upper to lower case and vice-versa
我正在编写代码来输入字符串并将其所有大写字母转换为小写字母,反之亦然:
#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);
检查你的逻辑。如果是小写字母,则将其转换为大写字母。在此之后,如果该字母是大写字母(如果最初是小写字母,则是大写字母),则将其转换为小写字母。
因为在你转换成大写之后,你马上又转换回小写。
顺便说一下,为什么不用toupper
和tolower
呢?
这是我从博客得到的代码,这可能有助于解决您的问题:
// 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位最低有效位,这是使用'^'(异或)来完成的。
相关文章:
- 如何在 c++ 中将所有大写字母转换为字符串中的小写字母,反之亦然?
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- 如何在 OpenCL 中将小写转换为大写,反之亦然
- 如何将CNG密钥转换为OpenSSL EVP_PKEY(反之亦然)?
- 快速将无符号字符的向量强制转换为POD结构的向量,反之亦然
- 在C++中,将无符号整数转换为八进制表示,反之亦然的最佳方法是什么
- 将 char[] 数组转换为字节,然后将字节转换为 int,反之亦然
- 将字节数组 (uint8_t) 转换为单词数组 (uint16_t),反之亦然
- 在Qt中将QString转换为ASCII值,反之亦然
- 封送处理 - 转换 std::向量<char>到字符串^ 反之亦然
- 将eigen :: sparsematrix转换为cusparse,反之亦然
- STD :: String和Qvariant(反之亦然)QT5之间的转换
- 如何将 Q 格式的整数转换为浮点数(反之亦然)
- 将qimage*转换为void*,反之亦然
- C :使用函数过载与CHAR到INT之间的隐式转换,反之亦然
- 如何将QPixMap转换为QPainterPath,反之亦然
- 从字符串转换为 uint8,反之亦然
- 创建一个将Centigrade转换为Wahrenheit的课程,反之亦然
- 如何将STD :: String转换为QString保留值,反之亦然
- 编译器可以静默地从 const 转换为 const 和,反之亦然吗?