[英]How to avoid Segmentation Fault
在這里,我有一個將數字字符轉換為羅馬文字的代碼,以下代碼適用於小於 3 位的小值,它應該工作到 4 位,當數字大於 1000 時,它返回分段錯誤異常。 什么是分段錯誤以及如何避免它們
#include <unordered_map>
#include <iterator>
#include <iostream>
#include <vector>
using namespace std;
int quotient(int nominator, int denominator);
string solution(int number){
std::unordered_map<int,string> Configuration;
std::string result;
int multimes=0;
string character;
Configuration[1000]="M";
Configuration[500]="D";
Configuration[100]="C";
Configuration[50]="L";
Configuration[10]="X";
Configuration[5]="V";
Configuration[1]="I";
vector<int> NumConfig={1000,500,100,50,10,5,1};
for(vector<int>::iterator it=NumConfig.begin();it!=NumConfig.end();++it)
{
multimes=quotient(number,*it);
number-=multimes* (*it);
character=Configuration.find(*it)->second;
int var=0;
if(multimes>0 && multimes<=3 ){
while(var < multimes)
{
result.append(character);
var++;
}}
else if(multimes>3)
{
result.append(Configuration.find(*it-1)->second);
result.append(character);
}
}
return result;
}
int quotient (int nominator,int denominator)
{
int result=(int)nominator/denominator;
return result;
}
int fromint (istream &str){int x;str>>x;return x;}
int main()
{
while(true)
{
cout<<solution(fromint(cin));
}
return 0;
}
嘗試使用諸如斷言之類的調試工具,將其放在任何指針分配之前以保護它
// ...
for(vector<int>::iterator it=NumConfig.begin();it!=NumConfig.end();++it){
assert( it != nullptr );
// ...
}
如果在這種守衛中准備的指針被違反,即。 布爾結果為假然后:
斷言“it != nullptr”失敗:文件“....
當輸入等於(5n -1)
(即 4,9,14...) 時,我可以看到分段錯誤,其中 n 是任何自然數。 Configuration.find(*it - 1)
返回Configuration.end()
通過顯式檢查Configuration.end()
避免分段錯誤
編輯
*it-1
將*it
值減一,而不是指向Configuration
先前值。 您可以將其更改為*(it-1)
以避免碎片錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.