在我处理用户输入的时候比如
12, 321.23
这样的坐标时,我采用了
sscanf("12, 321.23", "%lf,%lf", &x, &y);
但是当用户输入
12, 233.45@!5dkgj
即在合法数据后面,有非法的数据,如何才能检验出来呢?当然,其他形式的非法数据也要检验出来。我采用的方法是,通过call stack ESP register计算sscanf内部的一个变量的地址,然后当sscanf运行返回后,检查那个变量,来得知sscanf有没有利用完所有的数据,是否所有输入数据都是合法的。但是这种方法过于危险。请问大家有什么好方法吗?
12, 321.23
这样的坐标时,我采用了
sscanf("12, 321.23", "%lf,%lf", &x, &y);
但是当用户输入
12, 233.45@!5dkgj
即在合法数据后面,有非法的数据,如何才能检验出来呢?当然,其他形式的非法数据也要检验出来。我采用的方法是,通过call stack ESP register计算sscanf内部的一个变量的地址,然后当sscanf运行返回后,检查那个变量,来得知sscanf有没有利用完所有的数据,是否所有输入数据都是合法的。但是这种方法过于危险。请问大家有什么好方法吗?
解决方案 »
- callnamedpipe提示“系统找不到指定的文件”?
- com组件调试CoCreateInstance函数
- unknown error 0x800a0c93
- 请问大家Row Locking的实现方法(本人什么都不多,就是分多)
- 请教高手:如何获得快捷方式(.lnk)的源文件路径
- 用ShellExecute 执行批处理文件的问题,快来看一看
- ^&*$ DLL编译的问题 ^&*$
- bcg控件使用问题系列之三————怎样更改OUTLOOK面板上的文字标识
- 高手帮忙啊?看看这个代码怎么实现?
- 各位大侠,以太网接受浮点型数组!求高手
- 进来看看
- ===菜鸟问题===请问在ORACLE下,怎么用VC程序实现数据库里的数据的备份和还原??
上例看返回值是不是2
12, 233.45@!5dkgj返回值肯定是2,因为sscanf得到了2个合法的数据,但是在合法数据后面有非法数据,应该如何检测呢?另外这里的非法数据的识别检测是指一般的sscanf应用情况下的,
并不是固定的"%lf,%lf"这样的格式,其他应用格式都是有的。
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
{
// 有非法数据
}这样做是不是很危险
你可以判断一下,如果不是数字就给它删掉
int isdigit( int c );
所以不能用 isdigit() 来判断数据是否为非法。
pFile = (FILE*)dwEsp;pFile变量指向的是sscanf的局部变量,我通过检查它的数据,
来得知sscanf是否利用完所有数据。
我想把系统得到的数据返回给用户看,
并提供undo功能可能更好一点。
sscanf(" ","%f%f",...);
改成
{
char ch;
sscanf(" ","%f%f%c",...);
判断.
}
没有必要手工改
可以编个小程序