C++随机0xC0000005错误

C++ random 0xC0000005 errors

本文关键字:错误 0xC0000005 随机 C++      更新时间:2023-10-16

我制作了一个程序,将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

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

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

由于liekanos字符串从来没有任何大小或容量,因此您得到了未定义的行为。

string liekanos;

默认情况下,字符串的大小为零。但是你尝试

liekanos[j]=sk % p;

最好使用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;
}