阅读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; } string test=“[06/03/2013 18:15:23]信息-打开[Johny Cage]”; 整数天、月、年、秒、分钟、小时; 字符名[128]; int c=sscanf(test.c_str(),“[%d/%d/%d%d:%d:%d]信息-打开[%127[^\n]%c]”, &日、月、年、秒、分、时、名); 如果(c==7) { 通过对照检查,无法

阅读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; } string test=“[06/03/2013 18:15:23]信息-打开[Johny Cage]”; 整数天、月、年、秒、分钟、小时; 字符名[128]; int c=sscanf(test.c_str(),“[%d/%d/%d%d:%d:%d]信息-打开[%127[^\n]%c]”, &日、月、年、秒、分、时、名); 如果(c==7) { 通过对照检查,无法,c++,c,C++,C,。请尝试以下操作: 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); ]必须进行转义,否则它将被理解为“分隔符字符串的结尾”,它将是空的…因此是非法的 添加此项后,无论首先发生什么,它都将在换行符或

。请尝试以下操作:

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…毕竟,你不会把它保存到任何变量中


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

使用
[^]
而不是
[^\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]信息-打开[%[^]]”


这与除结束括号以外的任何内容都匹配。

使用
[^]]
而不是
[^\n]
@user315052:它失败了,程序崩溃了!
name[strlen(name)-1]=0;
[%127[^\n]%c]意味着忽略
[
然后最多复制127个字符,但不包括
\n
,然后复制任何字符(即,
\n
),然后忽略一个
]
。因此这将基本上复制任何内容,例如
[Johny Cage+3=5…
。由于
名称
缓冲区只能容纳128个字符,请使用
%127[^]]
相反,否则会有缓冲区溢出的风险。这会起作用,但会在输入文件中留下一个尾随
]
。它必须是
[%127[^]]
才能清除。如果
]
是开括号(或本例中的扬抑符)后的第一个字符,则它包含在集合中,不需要转义。不过,转义它肯定不会有什么坏处。