scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include <stdio.h>。它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。
函数原型编辑
int scanf(const char * restrict format,...);
函数 scanf() 是从标准输入流stdio (标准输入设备,一般指向键盘)中读内容的通用子程序,可以说明的格式读入多个字符,并保存在对应地址的变量中。[1]
函数的第一个参数是格式字符串,它指定了输入的格式,并按照格式说明符解析输入对应位置的信息并存储于可变参数列表中对应的指针所指位置。每一个指针要求非空,并且与字符串中的格式符一一顺次对应。
返回值编辑
scanf函数返回成功读入的数据项数,读入数据时遇到了“文件结束”则返回EOF。
如:
scanf("%d %d",&a,&b);
函数返回值为int型。如果a和b都被成功读入,那么scanf的返回值就是2;
如果只有a被成功读入,返回值为1;
如果a和b都未被成功读入,返回值为0;
如果遇到错误或遇到end of file,返回值为EOF。end of file为Ctrl+z 或者Ctrl+d。
例:使用scanf函数输入数据。
#include <stdio.h>
int main(void)
{
int a,b,c;
printf("Give me the value of a,b,c seperated with whitespaces:\n");
scanf("%d%d%d",&a,&b,&c);
printf("a=%d,b=%d,c=%d\n",a,b,c);
return 0;
}
&a,&b,&c中的&是寻址操作符,&a表示对象a在内存中的地址[2] ,是一个右值。变量a,b,c的地址是在编译阶段分配的(存储顺序由编译器决定)。
这里注意:如果scanf中%d是连着写的如“%d%d%d”,在输入数据时,数据之间不可以用逗号分隔,只能用空白字符(空格或tab键或者回车键)分隔——“2 (空格)3(tab) 4” 或 “2(tab)3(回车)4”等。若是“%d,%d,%d”,则在输入数据时需要加“,”,如“2,3,4”。
不经意中发现scanf()的返回值问题,自己试验和了解了一下,一些所知与各位分享;
void main()
{
int a;
int b;
int c;
printf("请输入三个整数:");
int x=scanf("%d%d%d",&a,&b,&c);
printf("%d/n%d/n",a,x);
}
1.scanf()函数有返回值且为int型。
2.scanf()函数返回的值为:正确按指定格式输入变量的个数;也即能正确接收到值的变量个数。
从上边的例子中可以得到验证,这里用变量x接收scanf()函数的返回值,并输出显示出来。
当运行中输入三个整数:5 6 7则x的值为3;
如果输入5 6 d(即给c 赋值不正确)则x的值为2;
如果输入5 t d(即给b和c 赋值不正确)则x的值为1;
当scanf函数的第一个变量格式不正确时返回值为0,即,当scanf函数的第n个变量格式不正确时,返回值为n-1
continue:
以前学习的时候书上说的是scanf()的返回值等于得到输入值的输入项的个数
scnaf(格式控制,输入项表);
照以上一般形式来看的话
main()
{int a,b,i;
i=scanf("%d%d%d",&a,&b);
printf("%d",i);}
应该输出2,因为就a和b两个输入项得到值了。
但是结果却是3
为什么?
这样的话是不是应该说成得到输入数据的格式说明的个数?
是3,因为是3个%d,输入项的个数是3个,不过是进了缓冲区3个,两个被赋值了,一个扔掉了而已。
那scanf()的返回值应该是进缓冲区的数据的个数,或是说得到输入数据的格式说明的个数,对吗?
像这样scanf("%d%d%d"如果输入1 2 3那返回值就是3,要是输入1 a 那返回值就是1因为只有第一个%d得到数据了,对吗?
scanf 函数的返回值反映的是按照指定的格式符正确读入的数据的个数。
如果输入数据与指定格式不符,则会产生输入错误。遇到输入错误,scanf函数会立即终止,返回已经成功读取的数据的个数。
所以,通过scanf函数的返回值和指定输入数据的个数(由格式符决定)的比较,可以判断数据输入是否成功。
就楼主的这个程序而言,是一个错误的程序,会导致segmentation fault,
因为没有有效的地址接受这个输入的第三个数,whyglinux的解释是正确的,如果程序可以正常的继续下去执行的话,返回值应该是2.
具体你的程序为什么能够返回,我不知道,我用的是gcc,winxp,运行的时候segmentation fault.
continue:
其实对于scanf这样的一些库函数其实对其来讲,他们使用起来并不是很友好,比如在不同的编译环境中,他们得到的结果数值是不一样的,这就需要如果我们需要在实际应用使用他们的话,就需要我们对他进行一些实际考证,这样才可以放心使用,其实说白啦,它的可移植性并不是很优秀吧
scanf()类函数是C函数库中最不可控制的,在程序设计中,不要用scanf()做人机交互界面,这是我一向的忠告。scanf()只适用于静态的数据扫描,即用fscanf()对已经定型在文本文件中的数据,它是高效有用的,但对动态、随机可变的人机交互情形,它会让你、程序以及用户均崩溃。