码迷,mamicode.com
首页 > 其他好文 > 详细

scanf类函数说明

时间:2015-07-06 17:36:15      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:

scanf家族除了scanf函数外,还有fscanf/sscanf,三者分别对应从标准输入/文件/字符串读取,对应的带不定参数版本分别为vscanf/vsscanf/vfscanf。

这类函数有返回值,执行成功时返回值为读取成功的字段个数,失败时返回EOF。注意,返回0也算成功,只不过没有读取到有效匹配。

函数在读取输入时,按照指定的模式format进行匹配,一旦发现匹配失败,函数立即返回,输入的字符仍保留在缓冲区里,也就是说,只取走匹配成功的字符。

下面举几个例子分别说明。

例1:写程序实现从标准输入按行读入数据,并按行原样输出,注意忽略空行,保证每行输入长度在50以内。

技术分享
1  uncle
2 
3 this is a test sentence.
Sample Input
技术分享
1  uncle
2 this is a test sentence.
Sample Output
技术分享
 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 }
View Code

 例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 }
View Code

例3:实现生肖赌博机的押注解析功能,用字母A-L(不区分大小写)分别代表鼠、牛...狗、猪这十二生肖,押注时可选择其中一种或多种动物,并可以指定相应押的钱数,如不指定钱数,默认为10块钱。了为便于后续结算,需要对押注数据进行解析和整理。输入数据有多行,每行为一条押注,只保含有效字母、数字、空格和等号。对每条押注进行解析,并按原顺序以“字母:数字”格式输出。

技术分享
1 A=10 B = 20 C 
2 acdb=10
3         b=22 a d = 7 c
Sample Input
技术分享
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 
Sample Output
技术分享
 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 }
View Code

 

scanf类函数说明

标签:

原文地址:http://www.cnblogs.com/boyfaceone/p/4624544.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!