scanf
1、 一条语句对多个变量复制
Ø 注意用户的输入要与设定一致
如果为scanf("%c%c%c"),那么输入的时候就必须连续输入3个字符,中间不能有任何空格逗号或者回车符等分开
如果是scanf("%c,%c,%c"),那么输入3个字符的时候中间就必须用一个逗号分隔。
Ø scanf("%d%c%d",&a,&f,&b)当类型有区别时,系统会自动区别,即输入1+2再回车时,a为1,f为+,d为2
Ø 当输入完整数或字符时,后面还需要输入字符时,要注意避免输入的字符变成回车符或空格(因为回车和空格也是字符,而且系统具有自动识别赋值功能)
如:scanf("%c%c%c",&a,&b,&c);输入1空格2空格3回车后,a=’1’ b=空 c=’2’
scanf("%c",&a);scanf("%c",&b);输入1回车后,a=’1’ b=回车
解决方法:
1)输入添加空白字符(空格)
scanf("%c",&a);
scanf(" %c",&b);
printf("%c\n",a);
输入a空格b回车后,a=’a’,b=’b’
2)用getchar()吃掉回车或空格 %c吃掉
scanf("%c",&a);
getchar();
scanf("%c",&b);
输入a空格b回车后,a=’a’,b=’b’
3)用%d吃掉
scanf("%d",&x); /*此时输入一串数字并回车,变量x将正常接收到输入的整数*/
scanf("%d",&y); /*若此时输入的是字母而不是数字,比如输入“s”并回车*/
/*那么变量y将不会接收到任何字符或数字,其值保持原样,不发生任何改变*/
scanf("%c",&a); /*此时变量a将接收到上一步输入的字母*/
/*即变量a中存储的字符将是"s",而不是回车符*/
因为回车符并没有被送进int类型变量中,而是在异常的字符输入后,被自动清除了。
为了方便记忆我理解为,%d可以吃掉之前的空格(回车),而%c会认亲把起当自己的输入
4)用fflush(stdin);清除缓冲区
scanf()函数接收输入数据时,遇以下情况结束一个数据的输入:(不是结束该scanf函数,scanf函数仅在每一个数据域均有数据,并按回车后结束)。
① 遇空格、“回车”、“跳格”键。
② 遇宽度结束。
③ 遇非法输入。
Ø 对于 int a[10];
scanf("%s",&a);
printf("%s",a);
输入:I love you回车后
输出只有I,因为scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"loveyou!"还在键盘缓冲区。scanf()函数每次扫描stdin流,残存信息仍在stdin中
用下面的代码可以验证
char str[80];
char str1[80];
char str2[80];
scanf("%s",str);/*此处输入:I love you! */
printf("%s",str);
sleep(5);/*这里等待5秒,告诉你程序运行到什么地方*/
scanf("%s",str1);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */
scanf("%s",str2);/*这两句无需你再输入,是对键盘盘缓冲区再扫描 */
printf("/n%s",str1);
printf("/n%s",str2);
return 0;
}
输入:I love you!
输出:I
love
you!