错误检查整数除以零
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 "...如你所见...",不,实际上,我们没有看到。您提供的代码甚至没有编译。包括一个工作(在这种情况下失败)runnablemain()
以及在启动时呈现给进程的 exact 命令行参数。
对不起,我又编辑了问题,谢谢指出!以上是关于错误检查整数除以零的主要内容,如果未能解决你的问题,请参考以下文章
为啥整数除以零 1/0 会出错但浮点数 1/0.0 返回“Inf”?