sscanf跳过首都'N'字母

时间:2014-02-17 22:09:07

标签: windows stdio scanf

我有一个奇怪的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. 问题在哪里?

提前谢谢!

2 个答案:

答案 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);