2012-02-22 10 views
0

ここに私のコードです:C++ EOFはcout <<上のCHAR(int型)鋳造

#include <cstdlib> 
#include <iostream> 
#include <cstring> 

using namespace std; 

int main(int argc, char *argv[]) 
{ 
    int duze[26]; 
    int male[26]; 
    int n; 
    //cout<<int('a')<<endl<<int('A'); 
    cin>>n; 

    char temp; 
    for (int i=0; i<27; i++) 
     male[i]=0; 
    for (int i=0; i<27; i++) 
     duze[i]=0; 

    while (n>=0) 
    { 
     cin.get(temp); 
     if (temp=='\n') { n--; continue;} 
     if (temp==' ') continue; 
     if (temp>='a' && temp<='z') 
      male[temp-'a']++; 
     else if (temp>='A' && temp<='Z') 
      duze[temp-'A']++; 
    } 

    for (int i=0; i<27; i++) 
     if (male[i]>0) cout<<char(i+'a')<<" "<<male[i]<<endl; 
    for (int i=0; i<27; i++) 
     if (duze[i]>0) cout<<char(i+'A')<<" "<<duze[i]<<endl; 
    //system("pause"); 
    return 0; 
} 

プログラムは、テキストの与えられたn行の文字をカウントします。存在しない文字はスキップされます。 コンソールで実行してもOKですが、文字の前にEOF文字があることがわかりました... どうすればいいですか?

+3

配列インデックスは '0'から' N-1'まで実行されます。ここで 'N'は要素の数です:すべての' for'ループは1つのアクセス回数が多すぎます。 – hmjd

+0

"文字の前にEOF文字があることを知っています"。そしてそれをどうやって知っていますか? –

+0

ああ、それを見なかった;)高校。返信を追加して、正しいものとしてマークします。 :D –

答えて

2

配列のインデックスはNは、要素の数であり、N-10から実行:forループの全ては、未定義の動作結果1あまりにも多くのアクセス。 forループの終了条件をi < 26に変更してください。 duzeの初期設定を簡素化する

別のマイナーノート、およびmaleあなたは、それらを宣言します。これは、あなたが現在これを行う2つのforループを削除することができることを意味し、0にすべての要素を設定し

int duze[26] = { 0 }; 
int male[26] = { 0 }; 

+0

の代わりに25でループを停止してチェックしてください。あなたは最初にいた:D –

3

あなたはbuffer overflow(実際にはそれらのうちのいくつか)を持っています。サイズが26(duzemale)の2つの配列を宣言しますが、データを27のインデックス(0〜26)に書き出します。

これはバッファの範囲外であるため、別のメモリでストンプすることになり、不安定で予測できない動作が発生します。 C++の標準ではの定義されていない動作:これを実行すると、プログラムがクラッシュしたり、このような微妙なエラーが発生したり、正常に動作しているように見えたり、ハードドライブを消去する可能性がありますそれはむしろそうではありません)。

これを修正するには、27のすべてを26に変更します。配列のサイズを27に増やすこともできますが、char(26+'a')を印刷すると{が得られますが、それはおそらくあなたの意図ではありません。

+0

または、サイトの制限のために26 –

2

あなたは次のことを確認する必要があります:

if (cin.get(temp)) 
{ 
    // read was ok 
} 
else 
{ 
    // eof or other issue on read 
}