2016-08-13 11 views
-4

私はコード作成の初心者で、ユーザーが入力した文字列の順序を逆順にするプロジェクトを与えられましたが、このコードを実行すると、何度も何度も間違っています。文字列を逆にする方法

例えば、"hi"と入力すると、"hi"が何度も印刷されます。あなたはインデックス演算子を使用する必要が

cout << arr << endl; 

:私は

#include <iostream> 

using namespace std; 

int main() 
{ 
    char arr[5]; 
    getline(cin, arr); 
    for(int x=4; x>=0; x--){ 
     cout << arr << endl; 
    } 
    return 0; 
} 
+2

文字列を逆順に印刷し、実際に文字列を反転することは、2つの異なることです。あなたのタイトルは文字列を実際に逆転させることを尋ねますが、逆の順序で印刷しようとしています。実際に何を達成しようとしていますか? – taskinoor

+0

ループを削除して 'cout << arr << endl;'のままにしておくと、何が印刷されますか?ループの中に置くと何か他のものが印刷されるのでしょうか? – molbdnilo

+0

あなたの最初のプログラムの1つにバグがあり、あなたの本能があなたの逆転方法のロジックを除く*すべてを調べることだったという事実は、関連していません。 – molbdnilo

答えて

0

この行は間違っている...(友人が推奨されているように)cingetlinescanfを使用してみましたが、無駄にしています[]このように:

cout << arr[x]; 

新しい行のすべての文字を印刷するので、endlはありません。

arr [x]を使用すると、インデックスxの配列(または文字列)の要素が得られます。 C++の要素インデックスは0から始まることに注意してください。最初の要素はarr [0]、2番目のarr [1]などです。

また、サイズ5のCスタイルの文字配列を使用するのはなぜですか?あなたは同じように効果的にC++のstd ::文字列を使用することができ、それが大きな文字列で動作します。このことができます

string x; 
getline(cin, x); 

for (int i = x.size() - 1; i >= 0; i--) 
{ 
    cout << x[i]; 
} 

cout << endl; 

希望を。

0

書くと、cout << arr << endl;はループの各繰り返しで文字列全体を印刷しています。代わりに、インデックスxに文字を印刷したいので、それをcout << arr[x];と書く必要があります。endlをループ内で使用すると、各文字の後に新しい行が表示されます。

また、C++では、文字列ライブラリを使用して文字列を処理する方が簡単です。次に、文字列の文字数をあらかじめ指定する必要はなく、ユーザーが4文字以上入力する必要がある場合に役立ちます。何が起こっている

#include <iostream> 
#include <string> 

using namespace std; 

int main() 
{ 
    string arr; 
    getline(cin, arr); 
    for(int x=arr.size()-1; x>=0; x--){ 
     cout << arr[x]; 
    } 
    cout << endl; 
    return 0; 
} 
+0

したがって、文字列ライブラリを含めると、コードは文字列ごとに文字列を読み取りますか?そして、これは配列のように文字列を扱うことができますか? –

+0

@ClovisNyu配列のように文字列の任意のインデックスを参照することができ、ユーザーが入力する可能性のある長さを心配する必要はありません。 – GoodDeeds

0

あなたはarrcoutから5倍の全体の内容を送っているです。代わりに、それぞれの文字を逆に印刷することが必要です。これを行うには、あなたのforループ内の時間でarrの唯一の文字を送信する必要があります。また

cout << arr[x] // This sends the character at index x to cout 
cout << arr // This sends the entire array to cout 

、あなたがforループの後cout << endlを持っている必要があります。それ以外の場合は、各文字の後に改行文字を出力します。

1

質問にはC++とタグ付けされているので、std::stringstd::reverseなどのC++構造体を使用する必要があります。これにより、より読みやすく理解しやすいコードになります。イテレータを使用して

#include <string> 
#include <iostream> 
#include <algorithm> 

int main() 
{ 
    std::string input; 
    std::getline(std::cin, input); 
    std::reverse(input.begin(), input.end()); 
    std::cout << input << std::endl; 
    return 0; 
} 
0

代替ソリューション:あなたの助けを

#include <iostream> 
#include <iterator> 
#include <algorithm> 
#include <string> 

int main() 
{ 
    std::string input; 
    getline(std::cin, input); 

    for (std::string::reverse_iterator rit=input.rbegin(); rit!=input.rend(); ++rit) 
    std::cout << *rit; 

    return 0; 
} 
0

感謝。バートとファングに反応して、申し訳ありませんが、私はあなたが話していることを完全に理解していません。 std ::は何をしますか?そして、イテレータは何ですか?率直に言って私はそれをまだ探そうとしていないので、私は実際に誰かがここで餌をスプーンすることを期待していません。 GoodDeedsとsyntax_errorで他の答えを読んだあと、興味深い発見ができました。

エラーが指摘されたのは、私がコードを使って何か影響があったかどうかを確認した結果でした。私はもともとarr [x]を書いていました.Arrではなく(endl thingyは私の誤りであることは間違いありませんでした)。驚いたことに、GoodDeedのコードを自分で貼り付けても問題は解決しませんでした。私はソフトウェアを疑うようになったので、コード全体を削除して、簡単に書きました< < hello ;.私の驚いたことに、それは依然として入力を求め、その入力を何度も印刷しました。

少しグーグルで調べたところ、私は「ビルド」について知りました。それを実際には理解していないのですが、コードを変更するたびにコードをビルドすることなく、明らかにコードブロックは変更を認識しません。

助けてくれてありがとう!

関連する問題