我正在使用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
,但输出为:
Johny Cage]
问题是尾随]
。如何使用上次sscanf
无法读取的]
?
答案 0 :(得分:7)
使用[^]]
代替[^\n]
。另外,删除扫描格式字符串末尾的%c
。
int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^]]]",
&day, &month, &year, &second, &minute, &year, name);
答案 1 :(得分:3)
通过检查它。试试这个:
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 ...毕竟,你不要把它保存到任何变量。
最后一次添加将读取它找到的下一个换行符,并丢弃它在路上找到的任何符号(因此为*)。
答案 2 :(得分:1)
我不确定你的名字是如何匹配的,但这对我有用:
int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%[^]]"
这匹配除了结束括号之外的任何内容。