scanf函数高级练习题
深入理解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
详细解析:
- 非格式符原样输入
- %s格式符在遇到空白字符时会停止读取,所以如果姓名包含空格,scanf只会读取第一个单词
- 如果输入中省略"Salary:"前缀,scanf会停止解析,salary变量不会被赋值
以下程序运行时,如果用户输入"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",输出结果会有什么变化?
解析与答案
详细解析:
- getchar()会读取缓冲区中的下一个字符'a'
- 如果输入"123 abc",getchar()会读取空格字符(' ')
以下程序如何利用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"时,程序会如何反应?
解析与答案
详细解析:
- scanf返回成功读取并赋值的参数个数
- 输入"12 abc"时,scanf成功读取一个整数(a=12),返回1,触发重新输入
以下程序运行时,输入为:"(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
详细解析:
- scanf格式字符串中的空格匹配任意数量的空白字符
- 输入中的空格、制表符等空白字符会被scanf忽略
- 即使输入没有空格,程序也能正常工作,因为格式字符串中的空格匹配零或多个空白字符
进入putchar练习