sscanf格式c ++

时间:2011-11-01 16:01:15

标签: c++ scanf

我有一个sscanf语句

sscanf (fieldname, "%s_%d", name, id);

我输入的内容为frog_461,但它显示的名称为“frog_461”,ID为0。您能否建议正确的方式来提供输入以使此声明有效?就像在上面的例子中一样,我应该如何输入我的输入,以便name =“frog”和id = 461。谢谢。


感谢您的所有投入。目前我无法修改代码,因此我并不是想找到一种让它工作的替代方法。我只是检查这段代码是否早期工作,如果是,那么用户必须提供什么输入才能使其正常工作。感谢。

4 个答案:

答案 0 :(得分:13)

到目前为止给出的答案突出显示sscanf的限制是错误的!使用sscanf有一个正确的方法:

sscanf(fieldname, "%[^_]_%d", name, &id); 

%[^_]表示读取直到遇到下划线字符。请参阅man page for scanf中的[条目。

另外,请注意id前面的&符号,有必要将指针传递给id,以便根据C的值传递语法来更改它。

顺便说一句,这实际上是一个C问题而不是C ++问题,所以你应该将它标记为这样。如果您使用的是C ++,则有比sscanf更好的选项进行解析。

答案 1 :(得分:1)

%s读取直到遇到空格,它不知道停在下划线。一种方法是使用strchr自己搜索下划线。然后,您知道字符串的第一部分结束的位置,并且可以使用%d读取该数字。

答案 2 :(得分:1)

也许海报知道他的令牌中的“标识符”部分只有(英文小写)字母,然后他可以尝试

char name[32];
memset (name, 0, sizeof(name));
if (sscanf(fieldname, "%31[a-z]_%d", name, num)>=2) {
   /* do something */
} else {
   /* bad fieldname */
}

对于字符串缓冲区溢出的C字符串(即字符数组),请注意sscanf;总是给出最大尺寸。

答案 3 :(得分:-1)

scanf不是一般的正则表达式解析器,它只处理空格。

您需要使用strtok()或类似方法拆分输入字符串,或者如果您知道格式只需将_替换为“”