2016-10-25 8 views
0

こんにちは私は本当にC++の新機能ですが、以前はJSとPHPでプログラミングされていました。 文字列を逆にしたいのですが、使用できる唯一の方法はlength()at()です。for loop decrementは機能しません。

私はすでに解決策を持っていますが、変更したいことがありますが、実際には私が実際にやっていることは実際には行っていません。

実際のソリューション:

getline(cin, user_input); 
    string inverted_user_input = ""; 

    int user_input_length = user_input.length() - 1; 

    for (int i = user_input_length; i > -1; i--) { 
     inverted_user_input += user_input.at(i); 
    } 

    cout << "The reverse string is: " << inverted_user_input << endl; 

私が何をしたい:

getline(cin, user_input); 
    string inverted_user_input = ""; 

    int user_input_length = user_input.length(); 

    for (int i = user_input_length; i > -1; --i) { 
     inverted_user_input += user_input.at(i); 
    } 

    cout << "The reverse string is: " << inverted_user_input << endl; 

私の最初のソリューションの作業罰金が、私はそれがきれいに見えるようにしたいです。
私はすでにlength()が1で数え始めていることを知っています。なぜ、私は最初のコードで1を引いているのですか?しかし、i--の代わりに--iを使用して、最初のコードのような醜い1を避けたいと思います。

私はプロンプトを出すと何かが出て、最初のループでiをチェックしましたが、それは減少しません。どうして?

+2

(キー制限の追加表示のある)「私が使用できる唯一の方法は、(長さ)及び()の」_うわー!あなたは '+'も使用しています。私の仕事を読んだことで、文字を入れ替えることになっているはずです。 –

+0

'--i'と' i - 'の違いは、' for'ループのインクリメントで実際には関係ありません。これは 'a [i - ]'と 'a [-i]'のようなどこかでのみ重要です。インクリメントは '--i'と' i- 'であるかどうかにかかわらずループの後に実行されます。 –

+0

--iはiを1減らして結果を返します。 私は - 私は戻って、私は1つを減らすことを意味...これは違いを作る理由を解決するために残します – UKMonkey

答えて

4

例では、--ii--は同じことを行います。長さ-1で始める必要があります。i----iの違いは、式で使用している場合です。あなたが--iをした場合たとえば、X = 10で

i = 10; 
x = i--; 

結果、私は= 9.ただし、代わりにあなたは、x = 9を持っているだろうし、forループポストをして、事前にI = 9

+0

私は '--i'と' i - 'をforループと同じにします –

+0

@Selfproblemmadeそれは完全には正しくありません。もしあなたが 'a = b - 'のようなものを持っていたら、それは絶対に違うでしょう。実際には、2つの異なる行を持っているかのように、そこに1つの式しかないという事実です。 - i; '。 –

3

減価償却はあなたの考えをしていません。ポストおよびプリデクリメントは、1つの式の中でデクリメントがどのように発生するかに関係します。たとえば、次のように

a = 1; 
b = a--; // b = 1; 
b = --a; // b = 0; 

しかし、forループで:

for (int i = user_input_length; 
    i > -1; 
    --i // This is a single expression 
) { 

したがって、この場合には、--ii--が同じことを行います。あなたがそのループをきれいにしたい場合は、次の操作を行います。ここでは

for (int i = user_input.length() - 1; i >= 0; --i) { 
    inverted_user_input += user_input.at(i); 
} 
+0

同じことだが、私はそれを得る:= –

3

はあなたに適応するのは簡単である必要があり、単純なユーザー定義関数を使用して文字列を逆転させる二つの方法、std::reverseアルゴリズムを使用して1、その他はニーズ:

#include <iostream> 
#include <string> 

void reverseString(std::string& s, int length){ 
    char temp; 
    for (int i = 0; i < length/2; i++) 
    { 
     temp = s[length - i - 1]; 
     s[length - i - 1] = s[i]; 
     s[i] = temp; 
    } 
} 

int main(){ 
    std::string s = "Hello"; 
    // Method 1 
    std::reverse(s.begin(), s.end()); 
    std::cout << s; 
    // Method 2 using a fn 
    reverseString(s, s.length()); 
    std::cout << s; 
    return 0; 
} 
0

多くの良い答えがここに--ii--にあります!しかし、あなたのコードは非常に長い文字列では機能しないかもしれません。

署名されたか、署名されない長さですか?

length of a stringは、符号なしタイプのsize_tです。それは最大の大きい正の値を保持することができますint cant express。 このような大きな長さをintに変換すると、符号がオーバーフローします。大きな正の数は負の値として誤って解釈されます。あなたのループは最初の反復の前に終了するでしょう!

文字列の最大長はstring::max_size()です。いくつかの実装では、それは最大の正の値intより小さい。しかし、これは標準によって保証されていません。

--iでこの問題を解決するにはどうすればよいですか?

符号なしの操作は注意が必要です。比較i > -1は、オーバーフローも発生する混在した操作になります。それをi>=0にすることは同等ですが、定義上、常に真になり、無限ループになります。ここで--i代わりにi--が必要エレガント修正:

string inverted_user_input = ""; 
for (auto i = user_input.length(); i >0 ;) { 
    inverted_user_input += user_input.at(--i); 
} 

Online demo _

関連する問題