2016-11-29 39 views
2

次のコードを使用して文字列を反転しようとしましたが、終わりのない小さなボックスの出力を得ようとしました。 (各行の1)forループを使用して文字列を反転するC++

コード:

#include <iostream> 
#include <math.h> 
#include <iomanip> 
#include <sstream> 



int main() { 


    // Reversing A String 
    cout<<"welcome to string reverser"<<endl; 
    int sizeOfString; 
    cout<<"please input size of string"<<endl; 
    cin>>sizeOfString; 
    char charray3[sizeOfString]; 
    cin>>charray3; 

    for(unsigned int i=sizeOfString-1; i>=0; i--){ 

    cout<<charray3[i]<<endl; 
    } 
return 0; 
} 

私の試みで、私は3にsizeOfStringを設定し、 'ABC' にcharray3を設定します。

出力:

box output

私が間違って何をやっていますか?

+3

デバッガでこのコードを実行するとどうなりますか? – MrEricSir

+0

'sizeOfString'は、文字列がメモリ内で占めるバイト数またはその中の文字数であると考えられていますか?あなたは 'abc 'の' sizeOfString'を3に設定して、それが有効な文字の数であることを意味しますが、それをメモリサイズであることを意味する配列のサイズとして使用します。なぜそれが両方になることができないのかわからない場合は、Cスタイルの文字列を理解できません。 –

+1

FYI、char char3 [sizeOfString]; 'は、' sizeOfString'が定数式でないときは標準C++ではありません。 – crashmstr

答えて

5
  1. 標準C++では、変数を配列のサイズとして使用することはできません。
  2. 文字列は、\0文字で終了します。
  3. 文字配列を使用せず、むしろstd::stringを使用してください。
  4. iは符号なし(i0の反復の後で符号なしが保持できる最も大きな値になります)のため、i>=0が常に真であるため、ループは決して嫌です。
5

文字列のサイズを尋ねないでください。可変長配列の構造体char charray3[sizeOfString]はコンパイラの拡張であるため、必要ではありませんが、プログラムは標準ではありません。

代わりにstd::getlineを使用すると、必要なだけ多くの文字を割り当てます。その後、上記と同じ方法で文字列を逆に印刷するか、必要に応じてその文字列を元に戻します。符号なしの減算には注意してください。あなたのコンパイラはそれについて警告する必要があります。

注:あなたのプログラムが動作しない理由場合は、あなたが思っているintを読んだ後、バッファに座って残っ'\n'あります。バッファリングされた文字のため、cin>>charray3を呼び出すとすぐにプログラムは空の文字列を返します。

2

あなたは、車輪を再発明している:)使用std::stringstd::reverse

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

int main() { 
    std::string str{"Hello, World!"}; 
    std::reverse(str.begin(), str.end()); 
    std::cout << str << std::endl; 
} 

Here's a working online example.

0
あなたは簡単にクラス文字列を使用することができます

#include <iostream> 
#include <string> 


int main() 
{ 

    std::string s1 = "Hello", s2; 

    for(int i(s1.length() - 1); i >= 0; i--) 
     s2+= s1[i]; 

    std::cout << s1 << std::endl; 
    std::cout << s2 << std::endl; 

    return 0; 
} 
  • がそれを解決するために文字配列を使用してあなたの方法で:

- sizeOfString 1つの質問を入力してください: 入力のサイズは、入力サイズが小さいか大きいかによってオーバーフローまたはアンダーフローしますか?

例:

sizeOfString = 5; 
cin >> charray3; // "ab" now the size is only 3 (+ null terminator) 

ので、書き込みは:あなたは結果セグメンテーションフォルトとしてのみcharray3[0]charray3[1]ので、入力されたので

charray3[sizeOfString - 1] = 'c'; // charray3[5 - 1] // charray[4] 

charray4が入力されていない間。

#include <iostream> 
using namespace std; 


int main() 
{ 
    // Reversing A String 
    cout << "welcome to string reverser" << endl; 
    int sizeOfString; 

    cout << "please input size of string" << endl; 
    cin >> sizeOfString; // you specified size 

    cin.ignore(1, '\n'); // clean the input buffer 

    char* charray3 = new char[sizeOfString + 1]; 
    //cin>>charray3; use getline instead to get whitespaces 

    cout << "enter text: " << endl; 
    cin.getline(charray3, sizeOfString); // what if the user enter a text smaller or bigger than sizeOfString??? 
    charray3[sizeOfString] = '\0'; 
    //to correct it: 

    // take effects of input on sizeOfString 
    sizeOfString = strlen(charray3); 

    cout << "before reversing: " << endl; 
    cout << charray3 << endl; 
    // to reverse it create a temporary array: 

    char* pTmp = new char[sizeOfString + 1]; 

    for(int i(sizeOfString-1), j = 0; i >= 0; i--, j++) 
     pTmp[j] = charray3[i]; 
    pTmp[sizeOfString] = '\0'; 

    cout << "after reversing: " << endl; 
    cout << pTmp << endl; 

    // don't forget to clean: 
    delete[] charray3; 
    delete[] pTmp; 

return 0; 
} 
+0

私はforwardsループを使用します:unsigned int sizeOfString; cout << "文字列のサイズを入力してください" << endl; cin >> sizeOfString; char char3 [sizeOfString]; cin >> charray3; for(符号なしint i = 0; i codingpeasant

0
// First method 
const int MAXLENGTH = 100; 
char s[MAXLENGTH]; 
cin >> s; 
int len = strlen(s); 
for(int i = 0; i < len/2; i++) { 
    char temp = s[i]; 
    s[i] = s[len-1-i]; 
    s[len-1-i] = temp; 
} 
cout << s; 

// Second 
string s; 
cin >> s; 
for(int i = 0, len = s.length(); i < len/2; i++) { 
    char t = s[i]; 
    s[i] = s[len-1-i]; 
    s[len-1-i] = t; 
} 
cout << s; 
-2

コードが神秘的に機能するようになりました:あなたは、いくつかの余分な作業を行う必要があり、それを修正する

。 1)ループをフォワードループにするように変更しました。 2)問題のコードに戻り、符号なしの型を削除しました。

#include <iostream> 
#include <math.h> 
#include <iomanip> 
#include <sstream> 



int main() { 


cout<<"welcome to string reverser"<<endl; 
    int sizeOfString; 
    cout<<"please input size of string"<<endl; 
    cin>>sizeOfString; 
    char charray3[sizeOfString]; 
    cin>>charray3; 

    for(int i=sizeOfString-1; i>=0; i--){ 

    cout<<charray3[i]<<endl; 
    } 
return 0; 
} 

ご意見ありがとうございます。私は提示されたさまざまな代替コードを試してみます。

関連する問題