scanf的正确使用及技巧
2016-07-14 14:17
267 查看
它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
使用scanf函数时要加上#include <stdio.h>。
首先从键盘读入键盘缓冲区(buffer)的数据都是以ASCII码存储的(包括回车)。
例如:
#incude<stdio.h>
int main()
{
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
printf("%c%c",a,b);
return
0;
}
终端操作:w[回车]
w
显然这个程序只输入一次,输出一次。
第一次回车后,buffer中的ASCII:
XX,0AH(0A是换行的ASCII), scanf会根据格式字符串中的第一个%c从对buffer按字节顺序读取,因为‘\n’也是一个字符,所以当读取到0A时,会将字符‘\n’给变量b。读取数据结束,此时buffer中已经无任何数据了。
自然打印出来的就是w\n,两个字符。
解决办法是:
#incude<stdio.h>
int main()
{
char a;
char b;
scanf("%c",&a);
getchar();
scanf("%c",&b);
printf("%c%c",a,b);
return
0;
}
当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符,在输入w[回车]时,buffer中的ASCII:
XX,0AH(0A是换行的ASCII),getchar 开始读取字符,并显示在屏幕上,此时buffer中是没有数据,在这儿getchar()起到了清除缓冲区的作用,这样,当遇到达尔戈scanf 是,可以正常输入,并显示在屏幕上。
在scanf读取的一个参数是数时,开始输入的空白字符会被忽略,读取数字直到遇到第一字符不是数字就会停止;
读取字符串时,开始的空白字符也会被忽略掉,读取字符【0-9a-zA-Z....](各种可显示字符),直到遇到不是字符停止匹配,(包括空白字符,通常为回车换行),并且在字符串尾添加空字符,(空字符是字符串输出结束字符).
scanf遇到停止字符时,把停止字符还放入键盘字符缓存区中。
匹配格式
int a;
char x[20];
printf("Hello, world\n");
scanf("%d%s",&a,x);
printf("%d",a)
printf("%s",x);
getch();
如果输入.......123 .....hello[回车]
输出 hello,world
123hello
如果将输入改成scanf("%dabc%s",&a,x);
输入:....123abc.......hello
输出结果如上
输入:......123ab......hello
输出结果123字符数组输出为乱码。
建议:当此次输入结束时,不管正确与否,都要刷新缓存区,否则有滞留字符干扰下一次的输入,使用getchar().
使用scanf函数时要加上#include <stdio.h>。
首先从键盘读入键盘缓冲区(buffer)的数据都是以ASCII码存储的(包括回车)。
例如:
#incude<stdio.h>
int main()
{
char a;
char b;
scanf("%c",&a);
scanf("%c",&b);
printf("%c%c",a,b);
return
0;
}
终端操作:w[回车]
w
显然这个程序只输入一次,输出一次。
第一次回车后,buffer中的ASCII:
XX,0AH(0A是换行的ASCII), scanf会根据格式字符串中的第一个%c从对buffer按字节顺序读取,因为‘\n’也是一个字符,所以当读取到0A时,会将字符‘\n’给变量b。读取数据结束,此时buffer中已经无任何数据了。
自然打印出来的就是w\n,两个字符。
解决办法是:
#incude<stdio.h>
int main()
{
char a;
char b;
scanf("%c",&a);
getchar();
scanf("%c",&b);
printf("%c%c",a,b);
return
0;
}
当用户键入回车之后,getchar才开始从stdio流中每次读入一个字符,在输入w[回车]时,buffer中的ASCII:
XX,0AH(0A是换行的ASCII),getchar 开始读取字符,并显示在屏幕上,此时buffer中是没有数据,在这儿getchar()起到了清除缓冲区的作用,这样,当遇到达尔戈scanf 是,可以正常输入,并显示在屏幕上。
在scanf读取的一个参数是数时,开始输入的空白字符会被忽略,读取数字直到遇到第一字符不是数字就会停止;
读取字符串时,开始的空白字符也会被忽略掉,读取字符【0-9a-zA-Z....](各种可显示字符),直到遇到不是字符停止匹配,(包括空白字符,通常为回车换行),并且在字符串尾添加空字符,(空字符是字符串输出结束字符).
scanf遇到停止字符时,把停止字符还放入键盘字符缓存区中。
匹配格式
int a;
char x[20];
printf("Hello, world\n");
scanf("%d%s",&a,x);
printf("%d",a)
printf("%s",x);
getch();
如果输入.......123 .....hello[回车]
输出 hello,world
123hello
如果将输入改成scanf("%dabc%s",&a,x);
输入:....123abc.......hello
输出结果如上
输入:......123ab......hello
输出结果123字符数组输出为乱码。
建议:当此次输入结束时,不管正确与否,都要刷新缓存区,否则有滞留字符干扰下一次的输入,使用getchar().
相关文章推荐
- linux ohmyzsh shell主题包以及修改shell命令
- [JQ权威指南]使用全局函数post()向服务器请求数据
- 常用 音频视频格式
- Maven
- js写的3D玫瑰花
- web前端知识汇总21-40
- Logger4j的使用
- iOS开发-常用第三方开源框架介绍(你了解的ios只是冰山一角)--(转)
- iOS开发之CoreAnimation简介
- Swift编程(一):UITableView及自定义Cell的Xib
- 度熊的字典
- 虚函数和纯虚函数的区别
- mac IDEA 快捷键
- HDU4833 Best Financing (DP)
- 查找
- ios 调试过程捕获异常Stack 信息
- PAT 团体程序设计天梯赛-练习集 L1-020. 帅到没朋友
- linux中du和df 的区别
- Unity3D功能嵌入到Android上
- The Heads-Up Grid 让你的HTML页面具有辅助线网格功能