簡體   English   中英

C ++隨機0xC0000005錯誤

[英]C++ random 0xC0000005 errors

我制作了一個將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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM