6

我正在使用 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它最后没有读到的]

4

3 回答 3

7

使用[^]]而不是[^\n]. 另外,删除%c扫描格式字符串的 at then 结尾。

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%127[^]]]",
               &day, &month, &year, &second, &minute, &year, name);
于 2013-03-06T19:50:14.757 回答
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 ......毕竟,你不会将它保存到任何变量中。

最后一个添加将读取到它找到的下一个换行符,并丢弃它沿途找到的任何符号(因此是 *)。

于 2013-03-06T19:47:43.383 回答
1

我不确定您匹配名称的方式会发生什么,但这对我有用:

int c = sscanf(test.c_str(), "[%d/%d/%d %d:%d:%d] INFO - Open [%[^]]"

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

于 2013-03-06T19:56:53.790 回答