通过扫描阅读全名
Read a full name by sscanf
我正在使用c++,但是我决定用sscanf
解析日志文件的行。在读取每行之后,它应该提取数据并将其存储到变量中。
string test = "[06/03/2013 18:15:23] INFO - Open [Johny Cage]";
int day, month, year, second, minute, hour;
char name[128];
int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^n]%c]",
&day, &month, &year, &second, &minute, &hour, name);
if (c == 7)
{
cout << name << endl;
}
我需要读取名称为Johny Cage
(名称可能有空格)并将其存储到name
,但输出是:
约翰尼笼)
问题是拖尾的]
。我如何使用sscanf
,它不读取最后的]
?
使用[^]]
代替[^n]
。此外,删除扫描格式字符串末尾的%c
。
int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^]]]",
&day, &month, &year, &second, &minute, &year, name);
通过对照检查。试试这个:
int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^]n]]%*[^n]n",
&day, &month, &year, &second, &minute, &year, name);
]必须转义,否则它将被理解为'分隔符字符串的结束',然后将为空…因此是非法的。
添加了这个后,它将在换行符或]处停止,无论哪个先出现。
当然要去掉%c…毕竟,您不会将其保存到任何变量中。
最后添加的字符将读取到它找到的下一个换行字符,并丢弃沿途找到的任何符号(例如*)。
我不知道你匹配名字的方式是什么,但这对我来说很有效:
int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%[^]]"
匹配除结束括号以外的所有内容。
相关文章:
- 检查不带转换的扫描格式
- 如何对__uint128_t进行位扫描(128位)?
- 我的 SonarQube C++扫描成功,但结果仅标记重复项,而没有标记其他标记的位置
- 使用扫描的调试断言失败
- 使用即将推出的C++反射工具打印类型的全名
- 如何在扫描中使用字符双指针?
- 使用 Clang LibTooling 扫描C++在模板化父类中调用本地类的源
- 为什么 EOF 在循环扫描期间没有终止?
- 有没有一种方法可以在linux中扫描已构建的ARM库中的函数
- ESP32_BLE_Arduino库中的扫描窗口、间隔和扫描时间之间有什么区别
- scanf() 语句中"%*[^n]"的格式字符串指示什么?分配抑制器 (*) 和否定扫描集 ([^) 如何协同工作?
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 开发QR扫描仪以扫描我生成的"only" QR码?
- 快速扫描标准以获取整数不起作用
- C++ 如何从文本文件中扫描二维数组并对行求和?
- 扫描阵列特定次数,然后找出元素
- C++客户端/服务器聊天应用程序 - 从 Ubuntu 命令窗口扫描输入
- c++ 中用于扫描数组的指针
- iwlist 在使用 execl 调用时尝试扫描所有接口
- 通过扫描阅读全名