从键盘到内存
键盘输入“a b c abc回车”
会将键盘输入内容缓存至键盘缓存区,等待程序中scanf() 读取
a | 空格 | b | 空格 | c | 空格 | a | b | c | 回车 |
---|
scanf原型
int scanf(const char * restrict format,...);
返回值为成功读取数据个数
例:
#include<stdio.h>
int main()
{
int a,b,c;
printf("%d",scanf("%d %d %d",&a,&b,&c));
}
运行环境:win7、 Dev-C++ 5.11
在用“%c”格式输入字符时,空白字符(space,tab,newline)和“转义字符”都作为有效字符输入。
输入:12 w d 回车
运行结果:
scanf中参数中 不属于格式指令的字符 的作用
空白字符
空白字符会使scanf函数在读操作中略去输入中的一个或多个空白字符;
常见使用scanf()赋多值时使用
例(程序读取时没有跳过空白字符):
#include<stdio.h>
int main()
{
char a,b,c;
static int num;
scanf("%c%c%c",&a,&b,&c);
printf("读取到的字符为:%c,%c,%c;",a,b,c);
}
输入“a b c回车”
例(程序读取时使用空白字符做分割):
#include<stdio.h>
int main()
{
char a,b,c;
static int num;
scanf("%c %c %c",&a,&b,&c);
printf("读取到的字符为:%c,%c,%c;",a,b,c);
}
输入:“a b c回车”
a,b之间一个空格,b,c之间两个空格
输入“ a b c回车”:
a前面有空格
第一个读取到的字符为"空格",读取到的“空格”后面没有跟其他空格,所以不需要剔除空格,之间开始第二个字符“a”的读取,第二个字符后面跟着空格,剔除空格后继续读取第三个字符"d"。
可参考 非空白字符在格式说明符后面 部分
非空白字符
一个非空白字符会使scanf()函数在读入时剔除掉与这个非空白字符相同的字符。
非空白字符在格式说明符后面
读取到一个字符时,检测后面是否有参数中的非空白字符,如果有,则剔除掉该字符(只能剔除一次该字符,不能像空白字符一样可以剔除发多次)。 ``` #include输入:“atbtct回车”
输出:
输入:“ttttttt回车” //输入7个t
输出:
t | t | t | t | t | t | t | 回车 |
---|---|---|---|---|---|---|---|
读取 | 删除 | 读取 | 删除 | 读取 | 删除 | 读取 | 回车 |
非空白字符在格式说明符前面
读取字符时得先检测到非空白字符才会读取字符(以 t 为例)。
#include<stdio.h>
int main()
{
char ch;
char chs[100];
static int num;
while(scanf("t%c",&ch))//此处读取
{
num++;
printf("%c\t",ch);
printf("%d\n",num);
}
scanf("%s",&chs);
printf("剩余在键盘缓冲区的未被读取的字符为:\n");
printf("%s\n",chs);
}
输入:“abcdefg回车”
输出:
输入:“tatbcdef回车”
输出:
补充:
在用“%c”格式输入字符时,空白字符和“转义字符”都作为有效字符输入。
在用“%s”格式输入字符时,输入的字符串中含有空白字符,字符串读取结束。
参考网址:
关于C/C++ stdin缓冲区以及对字符输入的一些经验和心得
https://blog.csdn.net/ShannonNansen/article/details/76090172
百度百科:scanf()
https://baike.baidu.com/item/scanf/10773316?fr=aladdin
scanf函数详解与缓冲区
https://blog.csdn.net/c_base_jin/article/details/24135463