我有一个奇怪的sscanf问题,大写字母'N'(也许我不明白正确的事情):
示例1:
char cBuff[128];
sscanf("GUIDNameNENE","%*[GUIDName]%127s" ,cBuff);
返回cBuff:ENE
示例2:
char cBuff[128];
sscanf("GUIDNamenENE","%*[GUIDName]%127s" ,cBuff);
返回cBuff:nENE
示例3:
char cBuff[128];
sscanf("GUIDNaMENE","%*[GUIDNa]%127s" ,cBuff);
返回cBuff:ENE
我尝试了很多其他变种,但仍然总是跳过资本N. 问题在哪里?
提前谢谢!
答案 0 :(得分:1)
%[GUIDName]
并不是引用和匹配精确字符串的奇怪方式。它定义了一组匹配的字符。它们将以任何顺序匹配,并且它们将重复匹配。
输入中%[GUIDName]
集的最长匹配为GUIDNameN
。
你当然可以说%*[G]%*[U]%*[I]%*[D]%*[N]%*[a]%*[m]%*[e]
并且不会吃任何字符GUIDNam
,但它仍会吃掉多个e
。
答案 1 :(得分:0)
我猜它跳过大写N的原因是因为它是你忽略的一组字符的一部分。关键点在于括号之间指定的是一组要匹配的字符,而不是固定顺序,而是sscanf尝试匹配最长的字符串,该字符串仅包含'['到第一个匹配后的字符']'。如果我没记错的话。
您可以尝试指定要跳过的字符集的大小,如下所示:
sscanf("GUIDNameNENE","%*8[GUIDName]%127s" ,cBuff);
但是这当然只有在字符串总是长八个字符时才有效,如果是,你可以选择忽略这样的八个初始字符:
sscanf("GUIDNameNENE","%*8s%127s" ,cBuff);