[英]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.