2017-09-15 47 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

可能な複製(https://stackoverflow.com/questions/24372480/reverse-string-c-using-char-array) –

+0

なぜあなたはこれを行うにしたいですライブラリは一切ありませんか? 'ostringstream'、' string'、 'cout'はすべて標準のC++ライブラリに入っているので、ライブラリを使わないと出力の非標準的な仕組みに頼っていることに気付くでしょう。標準ライブラリ 'std :: reverse(revStr.begin()、revStr.end())'は、1つの単純な行の要件を満たしています。 – Peter

答えて

1

私はあなたがstd :: stringを使用していることに気づいたので、std関数swapとstringを使用しました。これを「図書館」とみなしているかどうかによって異なります。 「逆」の定義はいくつかあります。あなたは、文字列内の単語の順序を逆にすることができます。あるいは、私が書いたように、charの逆にする純粋なcharを返すことができます。また、文字の大文字と小文字を区別することもできますが、これは最初と最後のスワップだけです。最後に2番目と2番目を入れ替えてから3番目と3番目を入れ替えてください。

コードからいくつかの点があります。文字列の長さの半分だけをループする必要があります。スワップはi番目とi番目から最後までです。したがって、最後はnumCharacters - 1なので、最後のiは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; 
} 

出力:文字列
を逆転

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

iと呼ばれる新しいintを作成し、最初にsizeに設定を意味します。次に、sizeがゼロの間は、次のようにしてからsize "を減らしてください。

これには二つの問題があります。

  1. サイズは、あなたがiを使用することはありませんので、あなたは1文字の文字列
  2. を入力しない限り、ループ内でそれ
  3. を宣言するにはポイントがありませんゼロではないが、毎回0に設定されているjを使用します。

あなたはsize >= 0forループの中央部分を変更することにより、最初のを修正(しかしそれがそれのために意味がありませんので、慎重に-場合sizeunsignedタイプになるように、あなたが後でそれを変更することができ否定的であれば、そのコードは機能しません;代わりに上がっていく方が一般的には良いです)。ループステートメントのどこでもiを使用し、sizeを変更しないで2番目を修正できます。ループ本体でiを使用し、ループ内で新しい変数を宣言しないで、3番目を修正できます。

+0

私はなぜ私自身の関数を記述したいのか理解していただきありがとうございます。 –

0

変更をgnirts、それが動作します。

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

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

     } 
[リバース文字列C++のchar配列を使用]の