我有一个sscanf语句
sscanf (fieldname, "%s_%d", name, id);
我输入的内容为frog_461,但它显示的名称为“frog_461”,ID为0。您能否建议正确的方式来提供输入以使此声明有效?就像在上面的例子中一样,我应该如何输入我的输入,以便name =“frog”和id = 461。谢谢。
感谢您的所有投入。目前我无法修改代码,因此我并不是想找到一种让它工作的替代方法。我只是检查这段代码是否早期工作,如果是,那么用户必须提供什么输入才能使其正常工作。感谢。
答案 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()或类似方法拆分输入字符串,或者如果您知道格式只需将_替换为“”