sscanf format c++
sscanf format c++
我有一个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
的指针才能更改它。
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()或类似的方法分割输入字符串,或者如果您知道格式,只需将_替换为" "
相关文章:
- Httpfile sendrequest -> format requestbody?
- Clang-Format 不能正确分配函数参数
- 编译器给出错误:format 指定类型 'float *',但参数的类型'double' [-Wformat]
- 什么 clang-format 相当于 rustfmt 的 indent_style=Block?
- <format> 找不到标头 (C++)
- clang-format:IncludeIsMainRegex不起作用
- 如何获得 fmt::format 与wchar_t一起使用?
- 为什么我从 gdbserver 获得"not in executable format: Success",但在 gdb 中一切正常?
- 如何在 C++ 中从 python 做 string.format()
- Clang-Format:重新组合字符串文字
- 特征"Sparse matrix format"示例是否包含错误?
- q致命参数:将 QString 转换为常量字符* 会导致警告"format string is not a string literal"
- 如何将非可变参数值传递给 fmt::format?
- 有没有办法强制对 clang-format/clang-tidy 中的类成员/方法使用 "this->"?
- 告诉Clang-Format忽略布拉格马斯
- 在 CString::Format 中使用 CString 对象
- Microsoft 编辑默认工具栏时的 Visual Studio 'Unknown Bitmap Format'
- QT 创建器:无法添加 OpenCV dll 库 ( "File format not recognized" )
- clang format函数和错误检查在同一行
- clang-format用于提升程序选项