user-0 提问: 一个转义的问题

回复:
user: user-1
content: 提醒：sscanf是开源的。 参考：C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c

user: user-0
content: 引用 7 楼 neunap 的回复:引用 楼主 kinolukaslana 的回复:源代码：  #include<stdio.h> int main() { 	char a[10] = { "\0" }; 	sscanf("qweiorewq","%*[^e]%[^w]",a); 	printf("%s", a); 	return 0; } 问题来了： 如果在转义哪里第一个[]里改成q或者w，就没有任何显示，求解？！  先说明一下，捕获的前提是每一项都需要匹配成功，才能够正常继续下一项匹配，如果匹配不成功，后续的匹配不会继续进行 比如，int a; char b[100];你需要捕获scanf("%d%s"， &a, b);但是实际输入的字符串是123 456（空白符在匹配%d时会忽略掉，这样会正常捕获123和"abc"，但是如果你输入的是h123 456，这样第一项就没有匹配成功，是不会再向后匹配的，这只能说明你要求的输入格式和实际输入格式不匹配。   sscanf("qweiorewq","%*[^e]%[^w]",a); %*[^e]：捕获到"qw"，因为带'*'，所以捕获之后舍弃 %[^w]：捕获到"eiore"，正常输出   sscanf("qweiorewq","%*[^q]%[^w]",a); %*[^q]：捕获不到数据，输入格式不匹配，直接退出 %[^w]：不进行捕获   sscanf("qweiorewq","%*[^w]%[^w]",a); %*[^w]：捕获不到数据，输入格式不匹配，直接退出 %[^w]：不进行捕获  引用 5 楼 kinolukaslana 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.但是老师，这个*不储存输入缓冲区的输入我理解，但是为什么我吧后面^也就是相反储存的不为^后面的字符，加上前面的*就是读取但是不储存，但是问题在于我把^后面的字符改成string的前两个就会整个string都不读取，意思就是后面的那个%就没有任何作用了，为什么会这样？   先说明一下，捕获的前提是每一项都需要匹配成功，才能够正常继续下一项匹配，如果匹配不成功，后续的匹配不会继续进行 比如，int a; char b[100];你需要捕获scanf("%d%s"， &a, b);但是实际输入的字符串是123 456（空白符在匹配%d时会忽略掉，这样会正常捕获123和"abc"，但是如果你输入的是h123 456，这样第一项就没有匹配成功，是不会再向后匹配的，这只能说明你要求的输入格式和实际输入格式不匹配。   sscanf("qweiorewq","%*[^e]%[^w]",a); %*[^e]：捕获到"qw"，因为带'*'，所以捕获之后舍弃 %[^w]：捕获到"eiore"，正常输出   sscanf("qweiorewq","%*[^q]%[^w]",a); %*[^q]：捕获不到数据，输入格式不匹配，直接退出 %[^w]：不进行捕获   sscanf("qweiorewq","%*[^w]%[^w]",a); %*[^w]：捕获到"q"，因为带'*'，所以捕获之后舍弃 %[^w]：捕获不到数据，输入格式不匹配，直接退出[/quote] 谢谢！昨天晚上我自己突然想通了，解释很详细！

user: user-2
content: 引用 楼主 kinolukaslana 的回复:源代码：  #include<stdio.h> int main() { 	char a[10] = { "\0" }; 	sscanf("qweiorewq","%*[^e]%[^w]",a); 	printf("%s", a); 	return 0; } 问题来了： 如果在转义哪里第一个[]里改成q或者w，就没有任何显示，求解？！  先说明一下，捕获的前提是每一项都需要匹配成功，才能够正常继续下一项匹配，如果匹配不成功，后续的匹配不会继续进行 比如，int a; char b[100];你需要捕获scanf("%d%s"， &a, b);但是实际输入的字符串是123 456（空白符在匹配%d时会忽略掉，这样会正常捕获123和"abc"，但是如果你输入的是h123 456，这样第一项就没有匹配成功，是不会再向后匹配的，这只能说明你要求的输入格式和实际输入格式不匹配。   sscanf("qweiorewq","%*[^e]%[^w]",a); %*[^e]：捕获到"qw"，因为带'*'，所以捕获之后舍弃 %[^w]：捕获到"eiore"，正常输出   sscanf("qweiorewq","%*[^q]%[^w]",a); %*[^q]：捕获不到数据，输入格式不匹配，直接退出 %[^w]：不进行捕获   sscanf("qweiorewq","%*[^w]%[^w]",a); %*[^w]：捕获不到数据，输入格式不匹配，直接退出 %[^w]：不进行捕获  引用 5 楼 kinolukaslana 的回复:引用 3 楼 zhao4zhong1 的回复:An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.但是老师，这个*不储存输入缓冲区的输入我理解，但是为什么我吧后面^也就是相反储存的不为^后面的字符，加上前面的*就是读取但是不储存，但是问题在于我把^后面的字符改成string的前两个就会整个string都不读取，意思就是后面的那个%就没有任何作用了，为什么会这样？   先说明一下，捕获的前提是每一项都需要匹配成功，才能够正常继续下一项匹配，如果匹配不成功，后续的匹配不会继续进行 比如，int a; char b[100];你需要捕获scanf("%d%s"， &a, b);但是实际输入的字符串是123 456（空白符在匹配%d时会忽略掉，这样会正常捕获123和"abc"，但是如果你输入的是h123 456，这样第一项就没有匹配成功，是不会再向后匹配的，这只能说明你要求的输入格式和实际输入格式不匹配。   sscanf("qweiorewq","%*[^e]%[^w]",a); %*[^e]：捕获到"qw"，因为带'*'，所以捕获之后舍弃 %[^w]：捕获到"eiore"，正常输出   sscanf("qweiorewq","%*[^q]%[^w]",a); %*[^q]：捕获不到数据，输入格式不匹配，直接退出 %[^w]：不进行捕获   sscanf("qweiorewq","%*[^w]%[^w]",a); %*[^w]：捕获到"q"，因为带'*'，所以捕获之后舍弃 %[^w]：捕获不到数据，输入格式不匹配，直接退出

user: user-0
content: 引用 1 楼 adusuccessfully 的回复:请教下楼主，scanf那句怎么理解呢？？赵老师回答的很准确

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.但是老师，这个*不储存输入缓冲区的输入我理解，但是为什么我吧后面^也就是相反储存的不为^后面的字符，加上前面的*就是读取但是不储存，但是问题在于我把^后面的字符改成string的前两个就会整个string都不读取，意思就是后面的那个%就没有任何作用了，为什么会这样？

user: user-0
content: 谢谢楼上赵老师！

user: user-1
content: An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

user: user-1
content: To read strings not delimited by space characters, a set of characters in brackets ([ ]) can be substituted for the s (string) type character. The corresponding input field is read up to the first character that does not appear in the bracketed character set. If the first character in the set is a caret (^), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.  Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. This is a common scanf function extension, but note that the ANSI standard does not require it.

user: user-3
content: 请教下楼主，scanf那句怎么理解呢？？