2012-03-05 80 views
2

我做了一個程序,它Ñ十進制數SK轉換爲其它數值系統p但有時它崩潰和錯誤代碼我得到的是0000005(程序仍然轉換,並輸出所有的數字) 。有一件事我只注意到它發生轉換後的數字超過6個符號(或者它只是一個巧合)。C++隨機0000005誤差

#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; 
} 

例輸入:

3 
976421618 7 
15835 24 
2147483647 2 
+0

只要你知道,'0xC0000005'是訪問衝突(壞指針)的錯誤。它通常意味着程序中的指針處理或內存分配存在缺陷。 – japreiss 2012-03-05 17:37:55

回答

3

隨着liekanos[j]您訪問元素在指數j但因爲你沒有指定這個字符串的大小,你最有可能試圖訪問不存在的元素。在輸入while循環之前,您可以撥打liekanos.resize(sk)以確保它永不發生。

或者,如果你知道liekanos最大可能的大小,你可以聲明爲string liekanos(N, c);其中N是它的大小和c是在它的每個字符的默認值。

+0

'std :: string'也調整了大小。爲什麼不把它保存爲'std :: string'? – Marlon 2012-03-05 17:22:24

+0

@Marlon:我的觀點是,它被聲明爲「字符串」,但從未被用作一個字符串。 – LihO 2012-03-05 17:23:25

+0

@Marlon:我編輯了我的答案。 – LihO 2012-03-05 17:35:12

1

你得到不確定的行爲,因爲你的liekanos字符串,不具有任何尺寸或容量。

1
string liekanos; 

默認情況下,字符串的大小爲零。但是你嘗試

liekanos[j]=sk % p; 
-1

更好地使用std::vector<char> liekanos;而不是string 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

爲什麼矢量會更好? – 2012-03-05 18:14:35

+0

@ Zyx2000我認爲'std :: vector '比'std :: string'更直觀,因爲我們一次只處理一個字符並獲取字符集合。 從性能角度來看,我認爲兩種解決方案都是平等的。 'std :: string'可能會更好,如果我們需要做一些操作,比如連接兩個表示。 – 2012-03-05 18:26:11