2017-09-15 104 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++; 

     }