如何才能得知sscanf有没有利用完所有的输入数据呢?

alphapaopao 2002-12-10 08:49:16
在我处理用户输入的时候比如
12, 321.23
这样的坐标时,我采用了
sscanf("12, 321.23", "%lf,%lf", &x, &y);
但是当用户输入
12, 233.45@!5dkgj
即在合法数据后面,有非法的数据,如何才能检验出来呢?当然,其他形式的非法数据也要检验出来。

我采用的方法是,通过call stack ESP register计算sscanf内部的一个变量的地址,然后当sscanf运行返回后,检查那个变量,来得知sscanf有没有利用完所有的数据,是否所有输入数据都是合法的。

但是这种方法过于危险。请问大家有什么好方法吗?
...全文
81 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
楼主灵活点,好么?
sscanf(" ","%f%f",...);
改成
{
char ch;
sscanf(" ","%f%f%c",...);
判断.

没有必要手工改
可以编个小程序
alphapaopao 2002-12-12
  • 打赏
  • 举报
回复
楼上的你的方法可能还不错,我去试试
  • 打赏
  • 举报
回复
sscan的返回值是正确读取的个数
上例看返回值是不是2
bojinyu 2002-12-11
  • 打赏
  • 举报
回复
返回非法数据给用户告诉他们出错了好像不是很好吧,
我想把系统得到的数据返回给用户看,
并提供undo功能可能更好一点。
alphapaopao 2002-12-11
  • 打赏
  • 举报
回复
有一点我可能没说清楚,我通过偏移量得到的变量是 sscanf函数内部的一个局部变量,如下

dwEsp -= 0x38; // 这个偏移量是我调试得到的
pFile = (FILE*)dwEsp;

pFile变量指向的是sscanf的局部变量,我通过检查它的数据,
来得知sscanf是否利用完所有数据。
alphapaopao 2002-12-11
  • 打赏
  • 举报
回复
楼上的老大,输入的格式 不一定就是 "%lf,%lf" ,我现在考虑通用的情况,
所以不能用 isdigit() 来判断数据是否为非法。
cbc 2002-12-11
  • 打赏
  • 举报
回复
能不能考虑先对你要读入的字符串做一下处理那
你可以判断一下,如果不是数字就给它删掉
int isdigit( int c );
alphapaopao 2002-12-11
  • 打赏
  • 举报
回复
我还是把我的代码贴上来吧,不过希望不会吓着大家

DWORD dwEsp;
asm mov dwEsp, esp;

FILE *pFile;
dwEsp -= 0x38; // 这个偏移量是我调试得到的
pFile = (FILE*)dwEsp;

sscanf("34,5,653", "%lf,%lf", &x, &y);
if(pFile->_ptr == pFile->_base + strlen(pFile->base)
{
// it's ok
}
else
{
// 有非法数据
}

这样做是不是很危险
alphapaopao 2002-12-11
  • 打赏
  • 举报
回复
哦,楼上的老大,是 sscanf() 而不是 scanf(),而且解析过程是 sscanf完成的,你不知道他在什么地方停下来了,并且得到了他想要的数据,并且,还遗留了一部分数据。

前几天我收到测试部的 bugreport,人家说,如果有遗留数据的话,也应该提示用户数据错误。好难办啊。我想找一种万全之策。
  • 打赏
  • 举报
回复
再用ch=getch();再看ch是不是回车,空格,tab
alphapaopao 2002-12-11
  • 打赏
  • 举报
回复
但是当用户输入
12, 233.45@!5dkgj

返回值肯定是2,因为sscanf得到了2个合法的数据,但是在合法数据后面有非法数据,应该如何检测呢?

另外这里的非法数据的识别检测是指一般的sscanf应用情况下的,
并不是固定的"%lf,%lf"这样的格式,其他应用格式都是有的。

16,473

社区成员

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

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

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