scanf类函数说明

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     while (~scanf("%c", &ch1)) {
 9         if ('\n' == ch1) { // 单条押注解析完成
10             printf("\n");
11             continue;
12         }   
13         if (!VALID_LOWER(tolower(ch1))) { // 首字符非字符,说明为空字符,需跳过
14             ungetc(ch1, stdin);
15             scanf("%*[ \t]%c", &ch1);
16         }   
17         for (scanf("%c", &ch2); ' ' == ch2 || '\t' == ch2; scanf("%c", &ch2)); // 跳过空字符
18         if (VALID_LOWER(tolower(ch2)) || '\n' == ch2) { // ch1不带数字,取默认值
19             ungetc(ch2, stdin);
20             printf("%c:10 ", ch1);
21         } else if ('=' == ch2) {
22             scanf("%d", &val);
23             printf("%c:%d ", ch1, val);
24         }   
25     }   
26     return 0;
27 }
View Code

 

转载于:https://www.cnblogs.com/boyfaceone/p/4624544.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值