c sscanf检查行中是否有多个参数?

时间:2016-02-19 12:18:37

标签: c scanf

是否有一些c技巧已经在其中一个库中构建,或者我必须写一些东西来手动检查它? 以下代码可以帮助我检测是否读取的参数数量太少,但不会太多,因为sscanf例如在3上停止,即使该行中有5个参数并转到另一行。

 if(sscanf(buffer, "%d", &elements->start_state_) != 1)
 {
   //code
 }

P.S。请记住,我正在逐行输入。

如果读取0或1个参数,该程序将运行良好,但未检测到超过1个并且对我来说是个问题。

2 个答案:

答案 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
}