在我处理用户输入的时候比如
12, 321.23
这样的坐标时,我采用了
sscanf("12, 321.23", "%lf,%lf", &x, &y);
但是当用户输入
12, 233.45@!5dkgj
即在合法数据后面,有非法的数据,如何才能检验出来呢?当然,其他形式的非法数据也要检验出来。我采用的方法是,通过call stack ESP register计算sscanf内部的一个变量的地址,然后当sscanf运行返回后,检查那个变量,来得知sscanf有没有利用完所有的数据,是否所有输入数据都是合法的。但是这种方法过于危险。请问大家有什么好方法吗?

解决方案 »

  1.   

    sscan的返回值是正确读取的个数
    上例看返回值是不是2
      

  2.   

    但是当用户输入
    12, 233.45@!5dkgj返回值肯定是2,因为sscanf得到了2个合法的数据,但是在合法数据后面有非法数据,应该如何检测呢?另外这里的非法数据的识别检测是指一般的sscanf应用情况下的,
    并不是固定的"%lf,%lf"这样的格式,其他应用格式都是有的。
      

  3.   

    再用ch=getch();再看ch是不是回车,空格,tab
      

  4.   

    哦,楼上的老大,是 sscanf() 而不是 scanf(),而且解析过程是 sscanf完成的,你不知道他在什么地方停下来了,并且得到了他想要的数据,并且,还遗留了一部分数据。前几天我收到测试部的 bugreport,人家说,如果有遗留数据的话,也应该提示用户数据错误。好难办啊。我想找一种万全之策。
      

  5.   

    我还是把我的代码贴上来吧,不过希望不会吓着大家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
    {
     // 有非法数据
    }这样做是不是很危险
      

  6.   

    能不能考虑先对你要读入的字符串做一下处理那
    你可以判断一下,如果不是数字就给它删掉
    int isdigit( int c );
      

  7.   

    楼上的老大,输入的格式 不一定就是 "%lf,%lf" ,我现在考虑通用的情况,
    所以不能用 isdigit() 来判断数据是否为非法。
      

  8.   

    有一点我可能没说清楚,我通过偏移量得到的变量是 sscanf函数内部的一个局部变量,如下dwEsp -= 0x38; // 这个偏移量是我调试得到的
    pFile = (FILE*)dwEsp;pFile变量指向的是sscanf的局部变量,我通过检查它的数据,
    来得知sscanf是否利用完所有数据。
      

  9.   

    返回非法数据给用户告诉他们出错了好像不是很好吧,
    我想把系统得到的数据返回给用户看,
    并提供undo功能可能更好一点。
      

  10.   

    楼主灵活点,好么?
    sscanf("  ","%f%f",...);
    改成
    {
    char ch;
    sscanf("  ","%f%f%c",...);
    判断.

    没有必要手工改
    可以编个小程序