Windows sscanf跳过capital';N';信

Windows sscanf跳过capital';N';信,windows,stdio,scanf,Windows,Stdio,Scanf,我对大写字母“N”有一个奇怪的sscanf问题(可能我不懂什么,请纠正我): 例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"

我对大写字母“N”有一个奇怪的sscanf问题(可能我不懂什么,请纠正我):

例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。 问题在哪里


提前谢谢你

我猜它跳过大写N的原因是因为它是你忽略的字符集的一部分。关键的一点是,在括号之间指定的是一组要匹配的字符,而不是按固定顺序,而是sscanf尝试匹配最长的字符串,该字符串仅由“[”之后的字符组成,直到第一个匹配的“]”。如果我没记错的话

您可以尝试指定要跳过的字符集的大小,如下所示:

sscanf("GUIDNameNENE","%*8[GUIDName]%127s" ,cBuff);
sscanf("GUIDNameNENE","%*8s%127s" ,cBuff);
但这当然只适用于字符串长度始终为8个字符的情况,如果是,您可以选择忽略8个初始字符,如下所示:

sscanf("GUIDNameNENE","%*8[GUIDName]%127s" ,cBuff);
sscanf("GUIDNameNENE","%*8s%127s" ,cBuff);

%[GUIDName]
引用和匹配精确字符串的方式并不奇怪。它定义了一组将匹配的字符。它们将以任何顺序匹配,并且将重复匹配

输入中设置
%[GUIDName]
的最长匹配是
GUIDNameN


当然,你可以说
%*[G]%*[U]%*[I]%*[D]%*[N]%*[a]%*[m]%*[e]
,这不会吃掉任何字符
GUIDNam
,但它仍然会吃掉多个
e

有帮助,这是真的,它是一组没有顺序的字符。