C ++随机0xC0000005错误

时间:2012-03-05 17:06:48

标签: c++

我制作了一个将 n 十进制数字 sk 转换为其他数字系统 p 的程序,但有时它会崩溃,我得到的错误代码是0xC0000005(程序仍然转换并输出所有数字)。有一件事我只是注意到它发生了然后转换的数字超过6个符号(或者它只是一个巧合)。

#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

4 个答案:

答案 0 :(得分:3)

使用liekanos[j]访问索引j处的元素,但由于您尚未指定此字符串的大小,因此您很可能尝试访问不存在的元素。您可以在输入liekanos.resize(sk)循环之前致电while以确保它永远不会发生。

或者,如果您知道liekanos的最大可能大小,则可以将其声明为string liekanos(N, c);,其中N是其大小,c是每个字符的默认值在它。

答案 1 :(得分:1)

您正在获得未定义的行为,因为您的liekanos字符串从不具有任何大小或容量。

答案 2 :(得分:1)

string liekanos;

默认字符串的大小为零。但你试着

liekanos[j]=sk % p;

答案 3 :(得分:-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;
}