sscanf format c++

sscanf format c++

本文关键字:c++ format sscanf      更新时间:2023-10-16

我有一个sscanf语句

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

我给输入frog_461,但它显示的名称为"frog_461"和0为id。你能建议正确的输入方式使这句话有效吗?就像上面的例子一样,我应该如何输入name="frog"和id=461。谢谢。


我感谢你所有的意见。目前我不能修改代码,因此我没有试图找到让它工作的替代方法。我只是检查这段代码是否在早些时候工作,如果是,那么用户必须输入什么才能使其工作。谢谢。

目前给出的强调sscanf局限性的答案是错误的!有一种正确的方法可以使用sscanf:

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

%[^_]表示读取直到遇到下划线字符。参见scanf手册页中[的条目。

另外,请注意id前面的&符号,由于C的按值传递语义,必须传递一个指向id的指针才能更改它。

顺便说一下,这实际上是一个C问题,而不是c++问题,所以你应该这样标记它。如果您正在使用c++,那么有比sscanf更好的解析选项。

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

也许发布者知道他的令牌的"标识符"部分只有(英文小写)字母,那么他可以尝试

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

注意C字符串(即char数组)的sscanf关于字符串缓冲区溢出;

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

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