2012-03-05 5 views
2

。私がちょうどそれが起こったことに気付いたことの1つは、変換された数字が6記号より長いことです(またはそれは単なる偶然のことです)。C++ランダム0xc0000005でエラー

#include <iostream> 
#include <fstream> 
#include <string> 

using namespace std; 

int main() 
{ 
    long n,sk,p,j; 
    string liekanos; 
    ifstream f("u1.txt"); 
    f >> n; 
    for (int i=0;i<n;i++) 
    { 
     f >> sk >> p; 
     j=0; 
     while (sk>0) 
     { 
      liekanos[j]=sk % p; 
      sk/=p; 
      j++; 
     } 
     for (j>=0;j--;) 
     { 
      if (liekanos[j]<10) 
       cout<<int(liekanos[j]); 
      else cout<<char(liekanos[j]+55); 
     } 
     cout<<endl; 
    } 
    return 0; 
} 

例入力:あなたのliekanos文字列は任意のサイズや容量を持っていないため

3 
976421618 7 
15835 24 
2147483647 2 
+0

だけ知っているので、 '0xC0000005'は、アクセス違反(不正なポインタ)エラーです。これは、一般に、プログラム内のポインタ処理またはメモリ割り当てに欠陥があることを意味する。 – japreiss

答えて

3

にしようとしていますが、この文字列のサイズを指定していないので、あなたが最も可能性の高い非既存の要素にアクセスしようとしています。 whileループを入力する前にliekanos.resize(sk)に電話して、決して起こらないようにすることができます。

それとも、liekanosの最大サイズを知っていれば、あなたはNはそのサイズであり、cは、その中の各文字のデフォルト値であるstring liekanos(N, c);として、それを宣言することができます。

+0

'std :: string'もサイズ変更されました。なぜそれを 'std :: string'としておくのはなぜですか? – Marlon

+0

@Marlon:私の指摘は、それは 'string'として宣言されていますが、決して1つとしては使われないということです。 – LihO

+0

@マールロン:私は自分の答えを編集しました。 – LihO

1

あなたは未定義の動作を取得しています。

1
string liekanos; 

デフォルトでは、文字列のサイズはゼロです。しかし、あなたは、インデックスjでアクセス要素liekanos[j]

liekanos[j]=sk % p; 
-1

string liekanos;の代わりにstd::vector<char> liekanos;を使用すると便利です。 あなたのコード内のいくつかの変更を行う必要があります:

for (int i=0; i<n; i++) 
{ 
    std::vector<char> liekanos; 
    f >> sk >> p; 
    while (sk>0) 
    { 
     liekanos.push_back(sk % p); 
     sk/=p; 
    } 
    for (long j = liekanos.size(); j>=0; --j) 
    { 
     if (liekanos[j]<10) 
      cout<<int(liekanos[j]); 
     else cout<<char(liekanos[j]+'a'); 
    } 
    cout<<endl; 
} 
+0

どのような理由でベクターがより良くなるのでしょうか? –

+0

@ Zyx2000ここで 'std :: vector 'は一度に一つの文字を処理して文字の集合を得るので、ここでは 'std :: string'よりも直感的だと思います。 パフォーマンスの観点からは、どちらのソリューションも同等だと思います。 2つの表現を連結するなどのいくつかの操作を行う必要がある場合は、 'std :: string'がより良いかもしれません。 –

関連する問題