【问题标题】:converting from upper to lower case and vice-versa从大写转换为小写,反之亦然
【发布时间】:2011-09-15 04:57:40
【问题描述】:

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

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

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

【问题讨论】:

    标签: c++ string


    【解决方案1】:

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

    你想要的是else if

    【讨论】:

    • 是的,只有我在想,这不会有问题,因为它是迭代,当将大写转换为小写时,索引会增加并指向字符串的下一个元素。非常感谢@神秘的
    • aaaaaaaaaaaaaaaa 我明白了,多么愚蠢的错误再次感谢。非常感谢
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      检查你的逻辑。如果字母是小写,则将其转换为大写。紧接着,如果字母是大写的(如果原来是小写的话),你会将它转换为小写。

      【讨论】:

        【解决方案4】:

        因为在你转换成大写之后,你就去转换回小写。

        对了,你为什么不用touppertolower呢?

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

            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) 完成的。

            【讨论】:

              猜你喜欢
              • 2017-01-26
              • 1970-01-01
              • 2014-02-15
              • 1970-01-01
              • 2016-02-24
              • 2013-09-21
              • 2020-12-29
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多