有什么办法检查一个表示INT32整数的字符串表示的数据是否越界了呢?

vioy 2004-11-25 10:39:22
1)不考虑字符串内含字母什么的其它字符,只有'0'~'9'数字和'-'号
2)考虑其他字符

主要是检查数值是否越界。

还有一个问题是float型的,我现在只能给100分,这个问题另开题。
...全文
791 25 打赏 收藏 转发到动态 举报
写回复
用AI写文章
25 条回复
切换为时间正序
请发表友善的回复…
发表回复
vioy 2004-11-30
  • 打赏
  • 举报
回复
整形的数可以说是解决了,虽然用VarI4FromStr()也能搞定,但还是谢谢各位。
现在就是浮点型了,iicup(双杯献酒)的方法还是有些局限性,或者说是间接性(个人意见)。

TO yangl79(杨):你的浮点型的算法能不能贴出来呢?还是不方便?

float的解决方法最好贴到 http://community.csdn.net/Expert/topic/3589/3589319.xml?temp=.1290247 中,要不我拷过去也行,不过起码要登记一下吧,否则没法给分^_^
vioy 2004-11-30
  • 打赏
  • 举报
回复
又搞错了,你这里的do{}while()根本就不是要做循环。
要达到目的直接用else把剩下的语句括起来也不行,对
if (re > 0 && (!re && *string != '-'))
break;
这个需要再想办法,看来你的方法的确有一套。


PS:不过你说的话也太狠了点吧?
vioy 2004-11-30
  • 打赏
  • 举报
回复
yangl79(杨) 不好意思,理解错了代码了

我上班工作的机器不能上网,能上网的机器没有装开发工具,所以没有测试,只是看了一遍。
头两个问题的确看错了。
第一个,如你所讲,把if看成while了
第二个,可能是把 10<len 看成 len<10,现在也不知道怎么想的了,应该是脑袋短路:(
第三个,还是没想通,为什么不是while(1)呢?难道do{}while()的循环条件为0才循环?
yangl79 2004-11-29
  • 打赏
  • 举报
回复
一下子看懂别人的程序不是一件容易的事,要不怎么说维护最难呢,如果你发现别人的程序有不对的地方,自己设计个测试用例来测试,发现问题后再说话!vioy(负电子云)你狂得比比尔盖茨还狂,我想他看到一个程序也不会马上说这儿这儿错了,哪儿哪儿是什么意思?

我在大学的时候有一次在食堂,中央5台在放围棋,两个9段高手走出来了征子的棋(就是一方走楼梯形,一方步步打吃),一个人站出来指中其中一人说:妈妈的,他会不会走棋啊!然后满意的离开食堂了,结果这盘棋我看完了,那种征子真是史无前例,他们绕着棋盘征了几圈,被征者在遇到棋盘边界的时候反弹回来,居然形成了反征!殊不知,食堂那位“高手”在想到一步棋的时候,两位9段高手已想到上百步棋后面去了!!
双杯献酒 2004-11-29
  • 打赏
  • 举报
回复
如果是判断float,
您可以假设这个数不会超过double,
(1)将数字转换成double
(2)将这个double与float的范围比较。
yangl79 2004-11-29
  • 打赏
  • 举报
回复
to vioy(负电子云) 你也太自信了吧?你现在什么水平啊?本来我是不想跟你们这样人说话的,你试过我的程序吗?我一个职业高级程序员写个算法出来你看一眼就指出三个错误?既然你这么狂,那我就教训你几句:
问题一:
if ('-' == *Opstring || '+' == *Opstring)
Opstring++;

while ('-' == *Opstring || '+' == *Opstring)
Opstring++;
不一样!

问题二:
最大整数为10位(十进制,大约2.1G)
if (10 < len)
break;
就是如果字符串大于10位,那一定越界了,所以跳出do while(0)循环。

问题三:
用do
{
}while(0);
是为了用break;语句跳到循环语句之外,这样避免使用goto语句,而且效率和goto语句一样高。

上面的算法大概是:在do while语句中判断字符串是否越界,如果是就break,不是就在循环语句中把字符串转化为整型,并退出。所以循环语句以外就是越界了。

多看看专业的程序源码,你这样不负责任的说话,你不怕有一天你见到我吗?那你钻到哪儿去呢?还是把脸皮扯下来放到口袋里?
agua06 2004-11-29
  • 打赏
  • 举报
回复
mark
vioy 2004-11-29
  • 打赏
  • 举报
回复
问题1:
if ('-' == *Opstring || '+' == *Opstring)
Opstring++;
这样的话一个整数前面随便怎么带 ‘+’‘-’都可以了?

问题2:为什么在循环里用这个判断退出?
if (10 < len)
break;
这样的话如果没有10位那么长的整数,直接就退出循环了,没有正确地转成整数

问题3:while(0)?这样还会循环吗?
yangl79 2004-11-28
  • 打赏
  • 举报
回复
上面的hParent参数可以不要,用AfxMessageBox代替MessageBox即可,这是我从一个工程中拷贝出来的。
yangl79 2004-11-28
  • 打赏
  • 举报
回复
如果要,我还有判断一个字符串是否是合法的浮点数的函数,这个比整要难得多,因为要考虑这样表达的浮点数:
10e03
.0e-2
等。都是由我写的。
yangl79 2004-11-28
  • 打赏
  • 举报
回复
#define NOTUSE 0 //不使用Min和Max参数
#define USEMIN 1 //使用Min参数
#define USEMAX 2 //使用Max参数
#define USEBOTH 3 //使用Min和Max参数,也可以用USEMIN | USEMAX表示
BOOL IsInteger(HWND hParent,char* string,int* Result,int Min /*= 0*/,int Max /*= 0*/,
int EffectMask /*= NOTUSE*/)
{
if (!string || !Result || (USEBOTH == EffectMask && Min > Max))
{
MessageBox(hParent, "参数错误或无效!", "错误", MB_ICONERROR);
return FALSE;
}

char * Opstring = string;

if ('-' == *Opstring || '+' == *Opstring)
Opstring++;

int len = strlen(Opstring);
for (int i = 0; i < len; i++) //查找是否有非法字符
if (Opstring[i] < '0' || Opstring[i] > '9')
break;

if (i != len || !len)
{
MessageBox(hParent, "请正确输入数据!", "提示", MB_ICONWARNING);
return FALSE;
}

char MaxInt[] = "2147483648"; //整数最大值的下一个值,其实不存在
do
{
if (10 < len)
break;
else if (10 == len)
{
int re = strcmp(Opstring, MaxInt);
if (re > 0 && (!re && *string != '-'))
break;
}

int CurrentResult = atoi(string); //现在可以安全地将字符串转化成整型了
if ((USEMIN & EffectMask && CurrentResult < Min) ||
(USEMAX & EffectMask && CurrentResult > Max))
break;

*Result = CurrentResult;
return TRUE;
}while(0);

CString OverFlowNotice;
OverFlowNotice.Format("溢出,正确的范围是:%d到%d。", Min, Max);
MessageBox(hParent, OverFlowNotice, "提示", MB_ICONWARNING);
return FALSE;
}

我自已写的一个函数,不但能判断是否越过最大整界,还能判断是否在Min和Max之间,经过无数次测试,保证可用。
vioy 2004-11-28
  • 打赏
  • 举报
回复
自己顶
vioy 2004-11-27
  • 打赏
  • 举报
回复
感觉qrlvls的方法有可行性,不过对于float型的没有办法。

费了几天的时间在MSDN上发现一个OLE函数VarI4FromStr()可以做到这一点,和这个函数相关的一批函数都有我需要的功能,不过不知道怎么实现的:(
不过VarR4FromStr()似乎也不能检查有效位长度太长。
shines77 2004-11-26
  • 打赏
  • 举报
回复
是想自己实现atoi(), atol(), atof()函数么,还是用在嵌入式系统?
oyljerry 2004-11-26
  • 打赏
  • 举报
回复
嗯,float型数字用> <来判断
vioy 2004-11-26
  • 打赏
  • 举报
回复
THANKS 试试先
pleasehelpme 2004-11-26
  • 打赏
  • 举报
回复
这里有得到最小、最大值的C++代码,应该有用

/*
Name: GetDataTypeSize
Date: 26-08-04 08:55
Description: get the minimum and maximum value of char,short
int,long,float,double,long double,and unsigned.
*/
#include <iostream>
#include <limits>
using namespace std;
int main()
{
cout << "Welcome to the C++ world!" << endl;
cout << "1.The min,and max values for char are " << (int)numeric_limits<char>::min()
<< "," << (int)numeric_limits<char>::max() << endl;
cout << "2.The min,and max values for short int are " << numeric_limits<short int>::min()
<< "," << numeric_limits<short int>::max() << endl;
cout << "3.The min,and max values for long are " << numeric_limits<long>::min()
<< "," << numeric_limits<long>::max() << endl;
cout << "4.The min,and max values for float are " << numeric_limits<float>::min()
<< "," << numeric_limits<float>::max() << endl;
cout << "5.The min,and max values for double are " << numeric_limits<double>::min()
<< "," << numeric_limits<double>::max() << endl;
cout << "6.The min,and max values for long double are " << numeric_limits<long double>::min()
<< "," << numeric_limits<long double>::max() << endl;
cout << "7.The min,and max values for unsigned are " << numeric_limits<unsigned>::min()
<< "," << numeric_limits<unsigned>::max() << endl;

cout << "enter a key to exit..." << endl;
int key;
cin >> key;
return key;// make Visual C++ happier...
}
qrlvls 2004-11-26
  • 打赏
  • 举报
回复
现在只讲正数
把你的最大的INT32 用CString::Format 转换成 字符串
先比较字符串长度,如果指定字符串长度长于由最大的INT32转换成的字符串长度,表示超过范围
如果小于字符串长度,则未超过范围
如果长度相等,则可以通过 CString 的 >, =, <, >=, <= 等重载操作符判断大小

负数的方法相同
danyueer 2004-11-26
  • 打赏
  • 举报
回复
注意到我没有用 == 这个运算符,这是因为按标准 C++ 代码规范 float 运算中不提倡直接用 == 来判断相等,因此本算法可以运用在float型判断中。
danyueer 2004-11-26
  • 打赏
  • 举报
回复
这个不难,你只要用同样的字符串来表示int_32(还有fload)的上下界数值,然后根据正负数情况从高位依次往下判断,不就可以了,伪码如下:

// 判断int_32型(fload型同理)
// LEN为数组长度

char Num[LEN]; // 源数据
const char Max[LEN]; // 最大值
const char Min[LEN]; // 最小值
int i = 1; // 计数器
if (Num是正数)
{
while (i < LEN)
{
if (Num[i] > Max[i])
{
越界处理;
break;
}
else if (Num[i] < Max[i])
{
肯定不会越界;
break;
}

i++;
}
}
else
{
while (i < LEN)
{
if (Num[i] > Min[i])
{
越界处理;
break;
}
else if (Num[i] < Min[i])
{
肯定不会越界;
break;
}

i++;
}
}

没越界;
return;
加载更多回复(5)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧