阅读sscanf的全名

时间:2013-03-06 19:43:29

标签: c++ c

我正在使用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无法读取的]

3 个答案:

答案 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 [%[^]]"

这匹配除了结束括号之外的任何内容。