2016-12-06 23 views
3
私は実際にC++反転文字列/シャア[]方法

C++は必要なことをします|シャア[] COUTと逆のchar []

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

私は3/5/7とそうで文字列を入力するときに問題が、あるに取り組んでいます

手紙の場合、それは正反対ですが、逆になりますが、2/4/6の文字列長さを入力すると文字が反転文字列にランダムな文字が付きます。

このエラーは偶数番号でのみ表示されるので、私は混乱しています。ここで

は、少し例を示します。ここ Here's a little example:

は、新しいコードである(すべてはここで正常に動作します)、私はそれが配列の最後に/ 0とは何かを持っていますが、なぜ偶数のみ知っています。

#include <iostream> 

using namespace std; 

void inverse(string input) 
{ 
    int length = input.length(); 
    char* output = new char[length + 1]; 

    for(int i = 0; i < length; i++) 
    { 
     output[length - (i + 1)] = input[i]; 
    } 

    output[length] = '\0'; 
    cout << output << endl; 
    delete output; 
} 

int main(int argc, char *argv[]) 
{ 
    while(true) 
    { 
     string in; 
     cin >> in; 
     inverse(in); 
    } 

    return 0; 
} 

誰でも私の解決策を見つけるのに役立つことができますか?

+1

まず、#include がありません。また、['std :: reverse'](http://en.cppreference.com/w/cpp/algorithm/reverse)を参照してください。 – rubenvb

+1

'std :: string output(length + 1、0);'の代わりに 'char * output = new char [length + 1];'を使うと、あなたはすでに 'std :: string'を引数として取ります。 –

+0

私はRalph Tandetzky Answerに同意します。 私はあなたのアプリケーションでメモリリークに気づいたので、配列全体を削除する必要があります。 'delete output;は' delete [] output'です。 –

答えて

3

文字列はNULLで終了しません。これが機能する

void inverse(string input) 
{ 
    reverse(input.begin(), input.end()); 
    cout << input << endl; 
} 

を試してみてください、あなたはstd::reverse()関数を定義algorithmヘッダーを含める必要があります。

偶数では機能しない理由は、通常はメモリ割り当てがメモリを少し予約してメモリ境界が正しく整列されるためです。したがって、偶数に切り上げることは無駄ではありません。それはちょうど推測です。ただし、未定義の動作を避けることを強くお勧めします。

0

\0で終了していないため、文字列の最後にゴミがあります。このような文字列を表示することは、C++では未定義の動作です。

幸運にも、あなたのコードは偶数の長さで動作していました。たとえば、私のマシンでは、1,2,3,5,6,7,8の長さの場合には効果があり、4の場合はゴミを印刷します。

UP:実際には、UBを避けてください。標準では、あなたがUBを持っているときに何が起こるかを指定していません - 理論的には、プログラムがクラッシュしたり、コンピュータが爆発したり、鼻から悪魔が現れることがあります。この特定のケースでは、何らかの理由でstd::reverseを使用したり、すべての作業を手動で行うことができない場合は、outputのコンテナとしてstd::stringを使用することをお勧めします。