簡體   English   中英

如何避免分段錯誤

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

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