scanf函数高级练习题

深入理解scanf函数的高级输入控制与缓冲区机制

进阶挑战

本练习包含1道进阶scanf函数题目,涵盖格式控制、缓冲区处理、返回值应用等高级主题

1
scanf格式控制与输入匹配

分析以下代码,当输入为:"Name:John_Doe Age:25 Salary:5000.50" 时,程序的输出是什么?

#include <stdio.h> int main() { char name[20]; int age; float salary; scanf("Name:%s Age:%d Salary:%f", name, &age, &salary); printf("Name: %s\nAge: %d\nSalary: %.2f\n", name, age, salary); return 0; }

挑战思考

1. scanf格式字符串中的"Name:"、"Age:"和"Salary:"有什么作用?

2. 为什么姓名输入使用下划线而不是空格?

3. 如果输入中省略"Salary:"前缀,会发生什么?

解析与答案

输出结果:

Name: John_Doe Age: 25 Salary: 5000.50

详细解析:

  1. 非格式符原样输入
  2. %s格式符在遇到空白字符时会停止读取,所以如果姓名包含空格,scanf只会读取第一个单词
  3. 如果输入中省略"Salary:"前缀,scanf会停止解析,salary变量不会被赋值
2
scanf缓冲区陷阱

以下程序运行时,如果用户输入"123abc",输出结果是什么?为什么?

#include <stdio.h> int main() { int num; char ch; scanf("%d", &num); ch = getchar(); printf("num=%d, ch=%c\n", num, ch); return 0; }

挑战思考

1. getchar()会读取到什么字符?

2. 如果用户输入"123 abc",输出结果会有什么变化?

解析与答案

输出结果: num=123, ch=a

详细解析:

  1. getchar()会读取缓冲区中的下一个字符'a'
  2. 如果输入"123 abc",getchar()会读取空格字符(' ')
3
scanf返回值应用

以下程序如何利用scanf返回值实现输入验证?当输入"12 abc"时程序如何反应?

#include <stdio.h> int main() { int a, b; printf("请输入两个整数:"); while(scanf("%d %d", &a, &b) != 2) { printf("输入错误,请重新输入两个整数:"); } printf("您输入的是:%d 和 %d\n", a, b); return 0; }

挑战思考

1. scanf的返回值表示什么?

2. 当输入"12 abc"时,程序会如何反应?

解析与答案

程序功能: 安全输入两个整数

详细解析:

  1. scanf返回成功读取并赋值的参数个数
  2. 输入"12 abc"时,scanf成功读取一个整数(a=12),返回1,触发重新输入
4
scanf高级格式控制

以下程序运行时,输入为:"(123) 456-7890",输出是什么?

#include <stdio.h> int main() { int area, prefix, line; scanf(" (%d ) %d - %d", &area, &prefix, &line); printf("Area: %d, Prefix: %d, Line: %d\n", area, prefix, line); return 0; }

挑战思考

1. scanf格式字符串中的空格和括号如何处理?

2. 输入中的空格会被忽略吗?

3. 如果输入"(123)456-7890"(没有空格),程序还能正常工作吗?

解析与答案

输出结果: Area: 123, Prefix: 456, Line: 7890

详细解析:

  1. scanf格式字符串中的空格匹配任意数量的空白字符
  2. 输入中的空格、制表符等空白字符会被scanf忽略
  3. 即使输入没有空格,程序也能正常工作,因为格式字符串中的空格匹配零或多个空白字符
进入putchar练习