标签:
scanf家族除了scanf函数外,还有fscanf/sscanf,三者分别对应从标准输入/文件/字符串读取,对应的带不定参数版本分别为vscanf/vsscanf/vfscanf。
这类函数有返回值,执行成功时返回值为读取成功的字段个数,失败时返回EOF。注意,返回0也算成功,只不过没有读取到有效匹配。
函数在读取输入时,按照指定的模式format进行匹配,一旦发现匹配失败,函数立即返回,输入的字符仍保留在缓冲区里,也就是说,只取走匹配成功的字符。
下面举几个例子分别说明。
例1:写程序实现从标准输入按行读入数据,并按行原样输出,注意忽略空行,保证每行输入长度在50以内。
1 uncle 2 3 this is a test sentence.
1 uncle 2 this is a test sentence.
1 #include <stdio.h> 2 int main() 3 { 4 char buf[64]; 5 int ret; 6 for (;;) { 7 ret = scanf("%[^\n]%*c", buf); 8 if (EOF == ret) // 没有输入数据了 9 break; 10 if (0 == ret) { // 空行 11 fgets(buf, sizeof(buf), stdin); // 取走回车换行符 12 continue; 13 } 14 printf("%s\n", buf); 15 } 16 return 0; 17 }
例2:mac字符串中保存了某块网卡的MAC,现需校验它是否有效,即是否满足"XX:XX:XX:XX:XX:XX"的格式。
1 int IsValidMac(const char *mac) 2 { 3 int b[6]; 4 return 6 == sscanf(mac, "%2X:%2X:%2X:%2X:%2X:%2X", 5 &b[0], &b[1], &b[2], &b[3], &b[4], &b[5]); 6 }
例3:实现生肖赌博机的押注解析功能,用字母A-L(不区分大小写)分别代表鼠、牛...狗、猪这十二生肖,押注时可选择其中一种或多种动物,并可以指定相应押的钱数,如不指定钱数,默认为10块钱。了为便于后续结算,需要对押注数据进行解析和整理。输入数据有多行,每行为一条押注,只保含有效字母、数字、空格和等号。对每条押注进行解析,并按原顺序以“字母:数字”格式输出。
1 A=10 B = 20 C 2 acdb=10 3 b=22 a d = 7 c
1 A:10 B:20 C:10 2 a:10 c:10 d:10 b:10 3 b:22 a:10 d:7 c:10
1 #include <ctype.h> 2 #include <stdio.h> 3 #define VALID_LOWER(n) ((n) >= ‘a‘ && (n) <= ‘l‘) 4 int main() 5 { 6 char ch1, ch2; 7 int val; 8 for (;;) { 9 if (EOF == scanf("%c", &ch1)) // 没有更多数据 10 return 0; 11 if (‘\n‘ == ch1) { // 单条押注解析完成 12 printf("\n"); 13 continue; 14 } 15 if (!VALID_LOWER(tolower(ch1))) { // 首字符非字符,说明为空字符,需跳过 16 ungetc(ch1, stdin); 17 scanf("%*[ \t]%c", &ch1); 18 } 19 for (scanf("%c", &ch2); ‘ ‘ == ch2 || ‘\t‘ == ch2; scanf("%c", &ch2)); // 跳过空字符 20 if (VALID_LOWER(tolower(ch2)) || ‘\n‘ == ch2) { // ch1不带数字,取默认值 21 ungetc(ch2, stdin); 22 printf("%c:10 ", ch1); 23 } else if (‘=‘ == ch2) { 24 scanf("%d", &val); 25 printf("%c:%d ", ch1, val); 26 } 27 } 28 return 0; 29 }
标签:
原文地址:http://www.cnblogs.com/boyfaceone/p/4624544.html