2017-09-15 97 views
0

我试图扭转一个字符串我的C++代码行下面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; 

} 
+0

[反向字符串C++使用char数组]的可能的复制(https://stackoverflow.com/questions/24372480/reverse-string-c-using-char-array) –

+0

你为什么要这么做没有任何图书馆?你意识到'ostringstream','string'和'cout'都在标准C++库中,所以不使用任何库会意味着你依赖于非标准的输出机制。使用标准库'std :: reverse(revStr.begin(),revStr.end())'可以在一条简单的线上满足要求。 – Peter

回答

1

我注意到你使用了std :: string,所以我使用了std function swap和string。取决于你是否认为这是一个'图书馆'。有几种“反向”的定义。你可以在字符串中反转单词顺序,或者像我写的那样用纯字符反转字符。反转也可能意味着更改字符大小写等等,但这只是简单地交换。然后交换第二和第二到最后,然后交换第三和第三到最后,等等...

因此,从您的代码中的一些点。你只需要循环一半的字符串长度。互换是从第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一个gnisrever

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 
+0

我不想使用嵌入函数来反转 –

+0

@DanaAmin“嵌入函数”是什么意思? 'std :: reverse'嵌入'main'的意义是什么,但是'std :: string :: at'不是? –

+0

我正在练习编程的人。它的实践,我想写一个程序,扭转了一个数字。 –

4

如果你只是想扭转一个字符串,你应该使用std::reverse,由泰勒·刘易斯描述。这是最好的选择。


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

线

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

的意思是“创建一个新的名为inti并将其设置为size开始。然后,虽然size为零,但执行以下操作,然后递减size“。

有两个问题:

  1. 大小不为零,除非你输入一个字符的字符串
  2. 因为你从来不使用i,有没有点宣布它
  3. 在循环中您使用每次都设置为零的j

您可以通过改变for循环的中间环节size >= 0固定第一(但要小心,如果以后改变它,以便sizeunsigned类型,因为它没有任何意义为它是负面的,那些代码将不起作用;相反,增加增量通常会更好)。您可以在循环语句中的任意位置使用i来修复第二个问题,并且不会更改size。你可以在循环体中使用i修复第三个,而不是在循环内部声明一个新的变量。

+0

感谢您理解我为什么要编写自己的功能。 –

0

的一段代码有问题所做的更改,它的工作原理。

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

      revStr[j] = str[size]; 
      j++; 

     }