2011-07-10 9 views
2
#include<iostream> 
#include<string.h> 
using namespace std; 
char * reverse (char *); 
int main() 
{ 
    char * a; 
    cout<<"enter string"<<endl; 
    gets(a); 
    cout<<a; 
    cout<<"the reverse of string is"<<reverse(a); 
    return 0; 
} 
char * reverse (char * b) 
{ 
    int i,j=strlen(b); 
    for(i=0;b[i]!='\0';i++) 
    { 
     char temp; 
     temp=b[j-i-1]; 
     b[j-i-1]=b[i]; 
     b[i]=temp; 
    } 
    return b; 
} 

このプログラムはコンパイル時にエラーが発生しません。しかし、実行時エラーが発生し、出力が得られません。原因を説明してください.C++でそれほどうまくいきませんので、私の質問が印ではないなら、私を許してください。文字列の逆順

+0

ランタイムエラーとは何ですか?そして出力は何ですか? –

+2

cout以外のC++はありません。 – taskinoor

+0

@ taskinoor - そうではありません。あるいは少なくとも、C言語に 'cout'、' '' '演算子' '、endl'、または' using namespace'がないことはかなり確信しています。 – aroth

答えて

7

文字列にメモリを割り当てていません。 getsはあなたのためにメモリを割り当てないので、ランダムな場所を読み込んでいるだけです。結果は未定義です。

それとは別に、そこに多くの問題です:

  • これがタグ付けされたC++が、それはCOUTとよりCのようなものだあなたが代わりにfgetsgetsを使用している
  • stringを使用することは良いアイデアでしょう)。 getsは非常に危険であり、避けるべきです。
2

最初の文字列にスペースを割り当てる必要があります。そうでなければ、エーテルを指し示し、上書きするだけで神はどのスペースを知っているのですか。しかし、よりイディオム的なC++は標準的な文字列を使用することをお勧めしますか?単にchar *をstd :: stringに置き換えてください。

1

referenceの適切な使用方法はgets()です。初期化されていないchar*を渡すことはできません。あなたはstd::stringを使用する必要が

char a[256]; 
cout<<"enter string"<<endl; 
gets(a); 
+7

いいえ、いいえ、マジックナンバーは正しい解決法ではありません。 – Puppy

+0

@DeadMG - 文字列(おそらくCS-101宿題です)を逆にする方法の簡単な例として、 'gets()'を使うことは適切な解決策ではありません。文字配列ではなく 'string'を使うこともできます。 – aroth

+1

@aroth:In myクラス私は定期的に非常に長い文字列に対して提出されたコードをチェックし、優雅に終了するのではなく、クラッシュするプログラムのポイントを減算します。 – thkala

6

:あなたはとのより良い運を持っているかもしれません。

#include <iostream> 
#include <string> 
#include <algorithm> 
#include <iterator> 
int main() 
{ 
    std::string a; 
    std::cout<<"enter string"<<endl; 
    std::cin >> a; 
    std::cout << "The reverse of a string is "; 
    std::copy(a.rbegin(), a.rend(), std::ostream_iterator<char>(cout)); 
    return 0; 
} 

標準は、使用しようとしているC-文字列のような非常識ではない文字列処理を提供し、それはまた、かなり自明逆反復を提供します。このモデルでは、独自のメモリを割り当てる必要はなく、独自の逆転を行う必要もありません。

+2

本当のC++の解決策は私の '+ 1'です。 (代わりに、おそらく初心者にとっては、 'std :: reverse()'と 'std :: cout << a'を使うことになります) – sbi

+0

存在していなかったかどうかは知りませんでした。私は 'std :: reverse'について聞いたことがありません:P – Puppy

2

これまでの回答に加えて、実際には文字列を2回反転しています。あなたは弦の半分しか歩かなくてはなりません。