是否有一些c技巧已经在其中一个库中构建,或者我必须写一些东西来手动检查它? 以下代码可以帮助我检测是否读取的参数数量太少,但不会太多,因为sscanf例如在3上停止,即使该行中有5个参数并转到另一行。
if(sscanf(buffer, "%d", &elements->start_state_) != 1)
{
//code
}
P.S。请记住,我正在逐行输入。
如果读取0或1个参数,该程序将运行良好,但未检测到超过1个并且对我来说是个问题。
答案 0 :(得分:2)
如果我已经正确理解,你想知道在一行上最后一个使用的参数之后是否有任何 - 我假设你通过调用char dummy[2]; /* save space for terminating null */
...
if(sscanf(buffer, "%d%1s", &elements->start_state_, dummy) != 1) {
...
}
获得了这一行。< / p>
我通常面对的问题只是尝试在最后一个参数后解码一个非空白字符:
sscanf
如果行> db.test.find({})
{ "_id" : ObjectId("56c70b588543cbc57664541d"),
"attr1": "val1",
"attr2": "val2",
"products" : [
{ "id" : 1, "name" : "apple" },
{ "id" : 2, "name" : "banana" },
{ "id" : 3, "name" : "pear" },
{ "id" : 4, "name" : "uu" } ] }
> db.test.find({}, {products: 1, products: {$slice: 2}, attr1: 0, attr2: 0})
{ "_id" : ObjectId("56c70b588543cbc57664541d"),
"products" : [ { "id" : 1, "name" : "apple" },
{ "id" : 2, "name" : "banana" } ] }
上没有(参数太少)将返回太低的值,并且如果至少有一个非空参数,则返回1太高。
答案 1 :(得分:1)
使用"%n"
保存到目前为止扫描的字符数。请注意," "
和"%n"
不会失败,也不会导致sscanf()
结果。
int n = 0;
// Allowing whitespace after the number
sscanf(buffer, "%d %n", &elements->start_state_, &n);
// or
// Dis-allowing whitespace after the number
sscanf(buffer, "%d%n", &elements->start_state_, &n);
if (n == 0 || buffer[n]) {
// problem with buffer
}