错误检查整数除以零

Posted

技术标签:

【中文标题】错误检查整数除以零【英文标题】:Error checking Integer division by zero 【发布时间】:2014-04-05 22:49:47 【问题描述】:

我正在 C++ 控制台中编写一个基本转换程序,我正在使用 argv[1] 和 argv[2] 输入数字和基数。

     #include "stdafx.h"
    #include <iostream>
 #include <cstdlib>
  #include <time.h>
 #include <math.h>
 #include <errno.h> 
 using namespace std;
const double MAXRANGE = pow(2.0,16.0); // 65536
 const double MINRANGE = -pow(2.0,16.0);

  int main(int argc, char *argv[])
 

int result;

if(atof (argv[1]) > 65536)
  
cout << "R" << endl;
return 0;
   

   if(atof (argv[1]) < -65536)
     
 cout << "R" << end;
 return 0;
    


    if(atof (argv[2]) > 65536 || (atof(argv[2]) < -65536))
    
cout << "R" << endl;
return 0;
     


    int no,base,i;
   no=atoi(argv[1]);
   base=atoi(argv[2]);


      if (argc == 3 )
        
   if(argv[2][0]=='b' && argv[2][1]=='2')
     
       cout<<"V"<<endl;

        return 0;
         

       i= no % base;
        no=no/base;
        cout<<i;

                

           return (0); 
             

我得到的错误是

lab1.exe 中 0x012851BE 处的未处理异常:0xC0000094:整数除以零。

我知道这个错误即将出现,因为我的条件为零。但我不确定,可以肯定的是我现在不知道如何进行错误检查。 我也试过另一个代码

            if(strcmp("b2",argv[2]==0 || strcmp("b3",argv[2]==0)

但它仍然会出现同样的错误。

那么,如何对 argv[2] 基数进行错误检查?用户必须输入作为基础的 argv[2],我想检查 argv[2] 必须是 'b1'、'b2'、'b3' 等。到 'b16'。

谢谢!

【问题讨论】:

您要除以的是 base,而不是 strcmp 相等性检查中不相关的 0。 @chris 是的,我可以理解错误但我该如何进行错误检查!thx! argv[2] == "b2" 调用base=atoi(argv[2]) 之后,你希望base 是什么?提示,这不是传递给atoi 的有效字符串。 是的!我有点明白我不能先做 int 然后再做字符串。有没有其他方法可以检查 argv[2]!谢谢@RetiredNinja 【参考方案1】:

您应该在相应的除法或 throwm 捕获之前检查基数是否为零并处理您的零除法异常,即:

if (!base) 
    ...
    // or early return depending on your use case
 else 
   i = no % base;
   no=no/base;

或:

   try 
       ...
       if (!base)
           throw std::overflow_error("Divide by zero exception");
       i = no % base;
       no=no/base;
    catch (std::overflow_error e) 
      ...
   

【讨论】:

我有点明白,但正如你所见,我的代码很简单。我只是一个初学者,你能告诉我如何使用 if 语句对 argv[2] 进行错误检查吗?谢谢! :) 当零是基数时,为什么要检查 argv[2]?您是否在某些未显示的代码中将 base 初始化为 argv[2]? 是的!对不起,用户必须在命令行中输入'b1'、'b2'等作为base。所以我需要检查有效的输入 'b1','b2'..etc.. @SbSangpi "...如你所见...",不,实际上,我们没有看到。您提供的代码甚至没有编译。包括一个工作(在这种情况下失败)runnable main() 以及在启动时呈现给进程的 exact 命令行参数。 对不起,我又编辑了问题,谢谢指出!

以上是关于错误检查整数除以零的主要内容,如果未能解决你的问题,请参考以下文章

无论结果如何,支持除以零的最快整数除法是啥?

c ++ opencv randu函数抛出'整数除以零'

为啥整数除以零 1/0 会出错但浮点数 1/0.0 返回“Inf”?

在java中的double和float类型数据相除为啥可以除以零

定义非零整数结构

将两个整数(一大一小)相除时得到错误答案