2012-03-05 57 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