通过扫描阅读全名

Read a full name by sscanf

本文关键字:全名 扫描      更新时间:2023-10-16

我正在使用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 [%[^]]"

匹配除结束括号以外的所有内容。