1

ロジックを修正するために最善を尽くしましたが、エラーを検出できません。[] やその他の高度な機能についてはまだ説明していないため、使用できません。もしよろしければ、私の間違いを教えてください。一生懸命頑張ったので、私の間違いは意味がありません。ありがとう。

このスクリプトは、入力文字列を逆にすることになっています。たとえば、hi を ih にします。

#include<iostream>
#include<string>
#include<cstdlib>
using namespace std;

void ReverseString(string &aString);

int main(){
    string info;
    cout << "What's your string?" << endl;
    getline(cin, info);
    cout << info << " compare with: " << endl;
    ReverseString(info);
    cout << info << endl;
    system("pause");
    return 0;
}

void ReverseString(string &aString)
{

    for(int i = 0; i < aString.length(); i++)
    {

        int u = aString.length() - 1 - i;
        string temp = "";
        temp += aString.at(aString.length() - 1 - i); 
        if(u == 0 )/* when aString.length() - 1 - i == 0, the last char will have been processed*/
        {
        aString = temp; /*store temp into aString; when its value changes, it is passed     into info's value*/
        }


    }

}
4

3 に答える 3

2

あなたの問題は、 for ループを実行するたびにReverseString()、変数を再初期化tempし、文字列に既に保存したものをすべて削除していることです。ReverseString 関数に対してこれを行うと、プログラムは期待どおりに動作します。

void ReverseString(string &aString)
    string temp = "";

    for(int i = 0; i < aString.length(); i++)
    {

        int u = aString.length() - 1 - i;
        temp += aString.at(aString.length() - 1 - i); 
        if(u == 0 )/* when aString.length() - 1 - i == 0, the last char will have been processed*/
        {
        aString = temp; /*store temp into aString; when its value changes, it is passed     into info's value*/
        }
于 2013-11-12T19:08:24.327 に答える
1

古い文字列の最後の文字を見て、それを新しい文字列の最後に置くことです。したがって、0 から最後までループする代わりに、最後から 0 までループします。ただし、新しい文字列をループの前に宣言する必要があります。これをループ内で行うと、反復ごとに常に内容が破棄されるためです。

string newString;
for(int i = aString.length() - 1; i > 0; i--) {
    newString.append(aString.at(i));
}
于 2013-11-12T18:58:45.007 に答える
1

古典的なイディオムには、スワッピングと 2 つのインデックスの維持が含まれます。

void
ReverseString( std::string& target )
{
    int bottom = 0;
    int top = target.size();
    while ( top > bottom ) {
        -- top;
        char tmp = target[top];
        target[top] = target[bottom];
        target[bottom] = tmp;
        ++ bottom;
    }
}

(実際にstd::swapは、ループ内で使用しますが、それも禁止されていると思います。)

これにより、その場でジョブが実行され、余分な中間文字列が回避されます。

于 2013-11-12T19:10:23.433 に答える