About validating number in tutorial02
emmmm这一部分在 https://github.com/miloyip/json-tutorial/issues/15 已经有了
在没有看答案的情况下试着实现了一下教程2的lept_parse_number中的validate number,发现和答案的意思不一样。
我做出来的效果是:把context里的json字符串一直检验到底,只要有不符合要求的字符就返回LEPT_PARSE_INVALID_VALUE。所以看到测试用例的时候觉得很奇怪,0x0居然是LEPT_PARSE_ROOT_NOT_SINGULAR,理论上x是非法字符才对。
还有就是发现对1.进行了测试而没有对1e进行测试。1.在事实上可以转换成1,而1e则会报错。所以感觉上就应该放在LEPT_PARSE_INVALID_VALUE的测试里吧。
但是
看了答案以后发现,原来只要找到第一个完整解析完成的位置就好了,剩下的需要算作LEPT_PARSE_ROOT_NOT_SINGULAR。仔细一想这样也是,上面的疑问就没有了。
所以,建议老师在这一方面加点提示,不要让大家想错了。
不过我觉得应该加一个123 的测试,证明一下数字的lept_parse_whitespace有效,还有往LEPT_PARSE_ROOT_NOT_SINGULAR里加一个123 123的测试。如果老师觉得现有的足够就无视吧:joy:
然后有一个问题,可不可以完全用一个正则来验证。
^-?(0|[1-9]\d*)(\.\d+)?([eE][+-]?\d+)?这个正则生成的图像应该是与教程中的图一样的,其他的测试都过了,但是它能匹配到1.的1。这样就不会是LEPT_PARSE_INVALID_VALUE而是LEPT_PARSE_ROOT_NOT_SINGULAR了。
不过现在加了一下判断匹配失败的地方如果是.,就返回-1。这样就搞定了。
emmmm这个应该是bug了。少了一个单纯的负号的测试,应该属于LEPT_PARSE_ROOT_NOT_SINGULAR才对,加了以后会不过。1E也没过……
确实,我做的时候也在想0123为什么是 LEPT_PARSE_ROOT_NOT_SINGULAR 而不是 LEPT_PARSE_INVALID_VALUE