【问题标题】:C++ reversing a stringC ++反转字符串
【发布时间】:2017-09-15 22:41:29
【问题描述】:

我正在尝试在 revStr.at(j) = str.at(size); 下方的 C++ 代码行中反转字符串

但它不会改变revStr 中的任何元素。

有没有其他方法可以在不使用任何库的情况下做到这一点。

#include <iostream>
#include<sstream>
#include <iterator>
using namespace std;


int main() {

    ostringstream d;

    long long c = 123456789;
    d << c;
    //cout << c << endl;
    string str = d.str();
    //cout << str.at(0) << endl;
    int size = str.size() - 1;
    //cout << size << endl;
    ostringstream e;
    e << str;
    string revStr = e.str();

for (int i = size; size==0; size--) {
    //cout << str.at(size);

        int j = 0;
        revStr.at(j) = str.at(size);
        j++;

} // End For

cout << "Original String is  :" << str << endl;
cout << "Reversed String is  :" << revStr << endl;

}

【问题讨论】:

  • 为什么要在没有任何库的情况下这样做?您确实意识到ostringstreamstringcout 都在标准 C++ 库中,因此不使用任何库将意味着您依赖非标准的输出机制。使用标准库std::reverse(revStr.begin(), revStr.end()) 只需一行即可满足要求。

标签: c++ string


【解决方案1】:

如果您只想反转一个字符串,您应该使用std::reverse,如 Tyler Lewis 所述。这是最好的选择。


如果您想学习 C++,那么编写自己的版本是一种很好的做法。

线

for (int i = size; size==0; size--)

表示“创建一个名为 i 的新 int,并最初将其设置为 size。然后,当size 为零时,执行以下操作,然后递减size”。

这样做存在三个问题:

  1. 大小不为零,除非您输入一个字符的字符串
  2. 因为你从不使用i,所以声明它没有意义
  3. 在循环内使用j,每次都设置为零。

您可以通过将 for 循环的中间部分更改为 size &gt;= 0 来修复第一个问题(但要小心 - 如果您稍后将其更改为 sizeunsigned 类型,因为它不将其设为负数是有意义的,该代码将不起作用;通常最好递增递增)。您可以通过在循环语句中的任何位置使用i 来修复第二个,而不是更改size。您可以通过在循环体中使用i 来修复第三个,而不是在循环内声明新变量。

【讨论】:

    【解决方案2】:

    使用std::reverse:

    #include <string>
    #include <algorithm>
    #include <iostream>
    
    int main()
    {
        std::string test{"Hello"};
        std::cout << "Original string: " << test << std::endl;
        std::reverse(test.begin(), test.end());
        std::cout << "Reversed string: " << test << std::endl;
        return 0;
    }
    

    输出:

    Original string: Hello
    Reversed string: olleH
    

    【讨论】:

    • 我不想使用嵌入式函数来反转
    • @DanaAmin “嵌入式函数”是什么意思? std::reverse 嵌入到 main 中是什么意思,但 std::string::at 不是?
    • 我正在练习编程。它用于练习,我想编写一个反转数字的程序。
    【解决方案3】:

    我注意到你使用了 std::string,所以我使用了 std 函数交换和字符串。取决于您是否将其视为“库”。 “反向”有多种定义。您可以反转字符串中的单词顺序,或者像我写的那样将纯字符反转为字符。反转也可能意味着改变字符大小写等......但这只是先和最后交换。然后将第二个和第二个交换到最后,然后将第三个和第三个交换到最后,等等......

    所以你的代码中的一些要点。您只需要循环一半的字符串长度。交换是从第 i 个和第 i 个到最后。所以最后一个是 numCharacters - 1,因此最后一个是 Last - i 或 numCharacters - 1 - i。我相信这就是您使用 farLeft(i) 和 farRight(j) 索引的目的。

    #include <iostream>
    
    void reverseStringInPlace(std::string &stringToReverse)
    {
        int numCharacters = stringToReverse.length();
        for (int i=0; i<numCharacters/2; i++)
        { std::swap(stringToReverse[i], stringToReverse[numCharacters-i-1]); }
    }
    
    int main()
    {
       std::string stringToReverse = "reversing a string";
       std::cout << stringToReverse << std::endl;
       reverseStringInPlace(stringToReverse);
       std::cout << stringToReverse << std::endl;
       return 0;
    }
    

    输出:

    反转字符串
    gnirts a gnisrever

    【讨论】:

      【解决方案4】:

      对有问题的代码进行了更改,它可以工作。

       for (unsigned int i = size; size >= 0; size--) {
      
                  revStr[j] = str[size];
                  j++;
      
              }
      

      【讨论】:

        猜你喜欢
        • 2020-02-07
        • 1970-01-01
        • 2020-06-28
        • 2010-10-21
        • 2015-05-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多