关于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\n" ); scanf ( "%d,%d,%d" ,&a,&b,&c); printf ( "a=%d b=%d c=%d\n" ,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! |
上述程序并不能达到预期目的,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\n",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\n",str1);
printf("%s\n",str2);
return 0;
}
{
char str[80],str1[80],str2[80];
scanf("%s",str);/*此处输入:Iloveyou!*/
printf("%s\n",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\n",str1);
printf("%s\n",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[^\n]" ,str); /*scanf("%s",string);不能接收空格符*/ printf ( "%s\n" ,str); return0; } |
******************************************************************************************************************************************************************
在scanf的用法中,不能出现一下情况
scanf("%.2f",&array[i]);
scanf里面不能有%.2f这样的格式,因为是键盘输入,不是计算机操作所以很难得到标准格式长度多少,有效是多少,
但是,printf可以用 %.2f 控制输出小数点的位数 (scanf("%lf",&array[i]);也是允许的~~)
在这里解释一下小数点前面是代表长度(超过了长度的话原样输出),小数点后面代表是有效位个数(有效位后面的四舍五入),