关于scanf输入数据时要注意的一些地方

例:使用scanf函数输入数据。
1
2
3
4
5
6
7
8
9
10
#include<stdio.h>
int main(void)
{
inta,b,c;
printf("输入a,b,c ");
scanf("%d,%d,%d",&a,&b,&c);
printf("a=%d b=%d c=%d ",a,b,c);
fflush(stdin);
return 0;
}
注意上面的scanf("%d,%d,%d",&a,&b,&c);中%d,%d,%d之间有逗号,输入数据时就必须用逗号将各个数据隔开
&a,&b,&c中的&是地址运算符,&a指a在内存中的地址。scanf的作用是:按照a,b,c的内存地址将a,b,c的值存进去。变量a,b,c的地址是在编译连续阶段分配的。
这里注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据是,数据之间不可以加逗号,只能是空格或tab键或者回车键——
空格的输入方式:“2 3 4”
TAB键的输入方式:“2(按tab)3(按tab)4(按tab)”。
回车键的输入方式:“2(按ENTER)3(按ENTER)4(按ENTER)”。
若是“%d,%d,%d”,则在输入数据时需要加“,”——“2,3,4”.
 
 

问题一

如何让scanf()函数正确接受有空格的字符串?如: I love you!
1
2
3
4
5
6
7
8
#include<stdio.h>
intmain(void)
{
charstr[80];
scanf("%s",str);
printf("%s",str);
return0;
}
输入:
1
Iloveyou!
输入只有 : I
上述程序并不能达到预期目的,scanf()扫描到"I"后面的空格就认为对str的赋值结束,并忽略后面的"love you!".这里要注意是"love you!"还在键盘缓冲区。我们改动一下上面的程序来验证一下:
#include<stdio.h>
#include<windows.h>
int main(void)
{
char str[80],str1[80],str2[80];
scanf("%s",str);/*此处输入:Iloveyou!*/
printf("%s ",str);
Sleep(1000);/*这里等待5秒,告诉你程序运行到什么地方*/
/*
不是sleep(5)
1,函数名是Sleep不是sleep。
2,C/C++中,unsignedSleep(unsigned)应该是毫秒ms.
*/
scanf("%s",str1);/*这两句无需你再输入,是对stdin流再扫描*/
scanf("%s",str2);/*这两句无需你再输入,是对stdin流再扫描*/
printf("%s ",str1);
printf("%s ",str2);
return 0;
}
以上程序就能解决问题~~~(额外加了3句)
 
好了,原因知道了,所以结论是:残留的信息 love you是存在于stdin流中,而不是在键盘缓冲区中。那么scanf()函数能不能完成这个任务?回答是:能!别忘了scanf()函数还有一个 %[] 格式控制符(如果对%[]不了解的请查看本文的上篇),请看下面的程序:
1
2
3
4
5
6
7
8
#include<stdio.h>
intmain(void)
{
charstr[50];
scanf("%49[^ ]",str);/*scanf("%s",string);不能接收空格符*/
printf("%s ",str);
return0;
}
******************************************************************************************************************************************************************
在scanf的用法中,不能出现一下情况
scanf("%.2f",&array[i]);
scanf里面不能有%.2f这样的格式,因为是键盘输入,不是计算机操作所以很难得到标准格式长度多少,有效是多少,
但是,printf可以用 %.2f 控制输出小数点的位数    (scanf("%lf",&array[i]);也是允许的~~)
在这里解释一下小数点前面是代表长度(超过了长度的话原样输出),小数点后面代表是有效位个数(有效位后面的四舍五入),
原文地址:https://www.cnblogs.com/phix/p/7118459.html