【问题标题】:reversing a string using a for loop C++使用 for 循环 C++ 反转字符串
【发布时间】:2017-04-13 23:18:30
【问题描述】:

我尝试使用以下代码反转字符串,但得到一个永无止境的小方框输出。 (每行 1 个)

代码:

#include <iostream>
#include <math.h>
#include <iomanip>
#include <sstream>



int main() {


     // Reversing A String
    cout<<"welcome to string reverser"<<endl;
    int sizeOfString;
    cout<<"please input size of string"<<endl;
    cin>>sizeOfString;
    char charray3[sizeOfString];
    cin>>charray3;

    for(unsigned int i=sizeOfString-1; i>=0; i--){

    cout<<charray3[i]<<endl;
    }
return 0;
}

在我的尝试中,我将 sizeOfString 设置为 3 并将 charray3 设置为 'abc'。

输出:

box output

我做错了什么?

【问题讨论】:

  • 在调试器中单步执行此代码时会发生什么?
  • sizeOfString 应该是字符串在内存中占用的字节数还是其中的字符数?你说你将“abc”设置为sizeOfString 3,暗示它是其中有效字符的数量,但是你用它作为数组的大小来分配,暗示它是内存大小。 (如果你不明白为什么不能两者兼而有之,那你就是不了解 C 风格的字符串。)
  • 仅供参考,当sizeOfString 不是常量表达式时,char charray3[sizeOfString]; 不是标准 C++。
  • 它是 C++,然后使用 std::string,而不是 char 数组。
  • 我知道您可以使用 char 数组定义字符串,如下所示:char array[]="hello";。传递 int 表示 char 的大小是有效的。

标签: c++ arrays loops reverse


【解决方案1】:
  1. 标准 C++ 不允许您使用变量作为数组的大小。
  2. 字符串以\0 字符结尾。
  3. 不要使用字符数组,而是使用std::string。
  4. 您的循环永远不会终止,因为i&gt;=0 始终为真,因为i 是无符号的(其中i 将是您的无符号在0 迭代之后可以保持的最大值)。

【讨论】:

    【解决方案2】:

    不要询问字符串的大小。除了没有必要之外,它还使您的程序非标准,因为可变长度数组构造 char charray3[sizeOfString] 是编译器扩展。

    改用std::getline,它将根据需要分配读取的字符数。之后,以与上面相同的方式反向打印字符串,或者如果您愿意,可以将字符串反转到位。小心无符号减法!不过,您的编译器应该警告您。

    注意:如果您想知道为什么您的程序无法运行,那么在读取int 后,缓冲区中还有一个剩余的'\n'。由于该缓冲字符,一旦您调用cin&gt;&gt;charray3,程序就会返回一个空字符串。

    【讨论】:

      【解决方案3】:

      您正在重新发明轮子 :) 使用 std::string 和 std::reverse:

      #include <algorithm>
      #include <iostream>
      #include <string>
      
      int main() {
          std::string str{"Hello, World!"};
          std::reverse(str.begin(), str.end());
          std::cout << str << std::endl;
      }
      

      Here's a working online example.

      【讨论】:

        【解决方案4】:

        您可以轻松使用类字符串:

        #include <iostream>
        #include <string>
        
        
        int main()
        {
        
            std::string s1 = "Hello", s2;
        
            for(int i(s1.length() - 1 ); i >= 0; i--)
                s2+= s1[i];
        
            std::cout << s1 << std::endl;
            std::cout << s2 << std::endl;
        
            return 0;
        }
        
        • 使用字符数组以您的方式解决它,请考虑:

        1- 你输入sizeOfString 一个问题: cin的输入溢出或下溢输入大小(更小或更大)怎么办???

        例如:

        sizeOfString = 5;
        cin >> charray3; // "ab" now the size is only 3 (+ null terminator)
        

        这么写:

        charray3[sizeOfString - 1] = 'c'; // charray3[5 - 1] // charray[4]
        

        而 charray4 未输入,因为您只输入了 charray3[0] 和 charray3[1],因此出现了段错误。

        要纠正它,你必须做一些额外的工作:

        #include <iostream>
        using namespace std;
        
        
        int main() 
        {
             // Reversing A String
            cout << "welcome to string reverser" << endl;
            int sizeOfString;
        
            cout << "please input size of string" << endl;
            cin >> sizeOfString; // you specified size
        
            cin.ignore(1, '\n'); // clean the input buffer
        
            char* charray3 = new char[sizeOfString + 1];
            //cin>>charray3; use getline instead to get whitespaces
        
            cout << "enter text: " << endl;
            cin.getline(charray3, sizeOfString); // what if the user enter a text smaller or bigger than sizeOfString???
            charray3[sizeOfString] = '\0';
            //to correct it:
        
            // take effects of input on sizeOfString
            sizeOfString = strlen(charray3);
        
            cout << "before reversing: " << endl;
            cout << charray3 << endl;
            // to reverse it create a temporary array:
        
            char* pTmp = new char[sizeOfString + 1];
        
            for(int i(sizeOfString-1), j = 0; i >= 0; i--, j++)
               pTmp[j] = charray3[i];
            pTmp[sizeOfString] = '\0';
        
            cout << "after reversing: " << endl;
            cout << pTmp << endl;
        
            // don't forget to clean:
            delete[] charray3;
            delete[] pTmp;
        
        return 0;
        }
        

        【讨论】:

        • 我使用转发循环:unsigned int sizeOfString; cout>sizeOfString; char charray3[sizeOfString]; cin>>charray3; for(unsigned int i=0; i
        【解决方案5】:
        // First method
        const int MAXLENGTH = 100;
        char s[MAXLENGTH];
        cin >> s;
        int len = strlen(s);
        for(int i = 0; i < len/2; i++) {
            char temp = s[i];
            s[i] = s[len-1-i];
            s[len-1-i] = temp;
        }
        cout << s;
        
        // Second
        string s;
        cin >> s;
        for(int i = 0, len = s.length(); i < len/2; i++) {
            char t = s[i];
            s[i] = s[len-1-i];
            s[len-1-i] = t;
        }
        cout << s;
        

        【讨论】:

          【解决方案6】:

          代码现在神秘地工作了。 1)我改变了循环,使它成为一个转发循环,它工作 2)我恢复到问题代码并删除了无符号类型。

          #include <iostream>
          #include <math.h>
          #include <iomanip>
          #include <sstream>
          
          
          
          int main() {
          
          
           cout<<"welcome to string reverser"<<endl;
              int sizeOfString;
              cout<<"please input size of string"<<endl;
              cin>>sizeOfString;
              char charray3[sizeOfString];
              cin>>charray3;
          
              for(int i=sizeOfString-1; i>=0; i--){
          
              cout<<charray3[i]<<endl;
              }
          return 0;
          }
          

          谢谢大家的cmets和答案。我将尝试提供的各种替代代码。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2021-10-28
            • 2014-02-17
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-02-07
            相关资源
            最近更新 更多