c语言scanf(用法详解)

scanf()是C语言中的一个输入函数。与printf函数一样,都被声明在头文件stdio.h里,因此在使用scanf函数时要加上#include<stdio.h>。(在有一些实现中,printf函数与scanf函数在使用时可以不使用预编译命令#include。)它是格式输入函数,即按用户指定的格式从键盘上把数据输入到指定的变量之中。

c语言scanf用法详解

scanf的功用用一句话来归纳便是“经过键盘给程序中的变量赋值”。该函数的原型为:

#include

intscanf(constchar*format,…);

它有两种用法,或许说有两种格式。

1)scanf(“输入控制符”,输入参数);

功用:将从键盘输入的字符转化为“输入控制符”所规则格式的数据,然后存入以输入参数的值为地址的变量中。

下面给咱们举个例子:

#include

intmain(void)

{

inti;

i=10;

printf(“i=%d\n”,i);

return0;

}

咱们前面都是像这样写的,即直接给变量i赋一个值。可是这样写功用比较弱,由于这个值就变成一个“死值”了,它只能是10,不可能是其他值,除非在程序中修正。许多时分咱们希望这个值不是由程序员在程序中指定的,而是在程序运转的过程中由用户从键盘输入的。用户输入多少,变量i便是多少,这样程序的功用就愈加灵活了。

那么如何完成在程序运转的过程中由用户从键盘输出值呢?用scanf即可完成:

#include

intmain(void)

{

inti;

scanf(“%d”,&i);//&i表明变量i的地址,&是取地址符

printf(“i=%d\n”,i);

return0;

}

“输入控制符”和“输出控制符”是一模相同的。比方一个整型数据,经过printf输出时用%d输出,经过scanf输入时同样是用%d。

要想将程序中的scanf行弄了解,首要要清楚的是:咱们从键盘输入的全部都是字符。比方从键盘输入123,它表明的并不是数字123,而是字符’1’、字符’2’和字符’3’。这是为什么呢?

操作体系内核便是这样运作的。操作体系在接收键盘数据时都将它当成字符来接收的。这时就需求用“输入控制符”将它转化一下。%d的意义便是要将从键盘输入的这些合法的字符转化成一个十进制数字。经过%d转化完之后,字符123便是数字123了。

第二个要弄清楚的是:&是一个取地址运算符,&后边加变量名表明“该变量的地址”,所以&i就表明变量i的地址。&i又称为“取地址i”,就相当于将数据存入以变量i的地址为地址的变量中。

那么以变量i的地址为地址的变量是哪个变量呢?便是变量i。所以程序中scanf的成果就把值123放到变量i中。

综上所述,scanf句子的意思便是:从键盘上输入字符123,然后%d将这三个字符转化成十进制数123,终究经过“取地址i”找到变量i的地址,再将数字123放到以变量i的地址为地址的变量中,即变量i中,所以终究的输出成果便是i=123。

留意,为什么不直接说“放到变量i中”?而是说“放到以变量i的地址为地址的变量中”?由于这么说尽管很绕口,可是能加强对&i的了解,这么说更能表达&i的实质和内涵。许多人在学习scanf的时分,经常将“变量i”和“变量i的地址”混杂,从而思想开端混乱,等深入了解&i的意义之后就能够不那么说了。

以上是scanf的最简单用法,也是最常用、最基本、最重要的用法。这样经过scanf就能够在程序运转的过程中由用户来指定变量i的值,这与在程序中赋值相比较功用更强大。

2)scanf(“输入控制符非输入控制符”,输入参数);

这种用法几乎是不用的,也主张你们永久都不要用。可是经常有人问,为什么printf中能够有“非输出控制符”,而scanf中就不能够有“非输入控制符”。事实上不是不能够有,而是没有必要!下面来看一个程序:

#include

intmain(void)

{

inti;

scanf(“i=%d”,&i);

printf(“i=%d\n”,i);

return0;

}

在printf中,全部的“非输出控制符”都要原样输出。同样,在scanf中,全部的“非输入控制符”都要原样输入。所以在输入的时分i=必需求原样输入。比方要从键盘给变量i赋值123,那么必需求输入i=123才正确,少一个都不可,不然便是过错。

所以scanf中%d后边也没有必要加\n,由于在scanf中\n不起换行的效果。它不但什么效果都没有,你还要原样将它输入一遍。

所以在scanf的运用中必定要记住:双引号内永久都不要加“非输入控制符”。除了“输入控制符”之外,什么都不要加,不然便是自找麻烦。并且关于用户而言,肯定是输入越简单越好。

一次给多个变量赋值:

#include

intmain(void)

{

inti,j;

scanf(“%d%d”,&i,&j);

printf(“i=%d,j=%d\n”,i,j);

return0;

}

首要,scanf中双引号内除了“输入控制符”之外不要加任何“非输入控制符”。经过键盘给多个变量赋值与给一个变量赋值其实是相同的。比方给两个变量赋值就写两个%d,然后“输入参数”中对应写上两个“取地址变量”;给三个变量赋值就写三个%d,然后“输入参数”中对应写上三个“取地址变量”……

可是需求留意的是,尽管scanf中没有加任何“非输入控制符”,可是从键盘输入数据时,给多个变量赋的值之间必定要用空格、回车或许Tab键离隔,用以区分是给不同变量赋的值。并且空格、回车或Tab键的数量不限,只需有就行。一般都运用一个空格。

此外强调一点:当用scanf从键盘给多个变量赋值时,scanf中双引号内多个“输入控制符”之间千万不要加逗号,。

有些人觉得在输入的时分能够用逗号分隔,所以就在“输入控制符”之间用逗号离隔。这样做从程序的视点确实是能够的,可是主张咱们不要这样做。在实际编程中这种写法是绝对不允许的,原因有两个:

首要逗号要原样输入的,有几个就要输入几个,少一个或多一个都不可;

其次,也是最主要的原因便是输入法的问题,在scanf中是在英文输入法下写的逗号,那么输入的时分假如是中文输入法下的逗号那也是错的。所以用逗号很简单犯错。

终究再次强调:scanf“输入参数”的取地址符&千万不要忘了。这是初学者经常犯的过错。而printf中的“输出参数”是不带取地址符的,不要混杂了。
图片[1]-c语言scanf(用法详解)-宏启网络科技丨崇尚专注-追求极致,运用scanf的留意事项,1)参数的个数必定要对应

在前面介绍printf时说过,“输出控制符”和“输出参数”不管在“次序上”仍是在“个数上”必定要一一对应。这句话同样对scanf有效,即“输入控制符”和“输入参数”不管在“次序上”仍是在“个数上”必定要一一对应。比方:

#include

intmain(void)

{

charch;

inti;

scanf(“%c%d”,&ch);

printf(“ch=%c,i=%d\n”,ch,i);

return0;

}

在VC++6.0中的输出成果是:

a6

ch=a,i=-858993460

这种过错是初学者经常犯的,由于粗枝大叶,少写一个参数。更严峻的是,这种过错在编译的时分不会报错。printf也是相同,即使“输出参数”少写了也不会报错,但从程序的功用上讲这么写便是错的。所以在编程的时分必定要防止这种过错的产生。

程序中为什么i=–858993460?这个在《为什么要初始化变量》中讲过,当变量没有初始化的时分就会输出这个值。

在后边会讲到scanf是缓冲输入的,也便是说从键盘输入的数据都会先存放在内存中的一个缓冲区。只有按回车键后scanf才会进入这个缓冲区和取数据,所取数据的个数取决于scanf中“输入参数”的个数。所以上述程序中scanf只有一个输入参数,因此按回车键后scanf只会取一个数据。所以变量ch有数据,而变量i没有数据,没有数据便是没有初始化,输出便是–858993460。

2)输入的数据类型必定要与所需求的数据类型共同

在printf中,“输出控制符”的类型能够与数据的类型不共同,如:

#include

intmain(void)

{

inti=97;

printf(“i=%c\n”,i);

return0;

}

在VC++6.0中的输出成果是:

i=a

可是在scanf中,关于从键盘输入的数据的类型、scanf中“输入控制符”的类型、变量所界说的类型,这三个类型必定要共同,不然便是错的。尽管编译的时分不会报错,但从程序功用的视点讲便是错的,则无法完成咱们需求的功用。比方:

#include

intmain(void)

{

inti;

scanf(“%d”,&i);

printf(“i=%d\n”,i);

return0;

}

在VC++6.0中的输出成果是:

a

i=-858993460

输出–858993460表明变量未初始化。为什么输入a,变量i却显示未初始化呢?

在scanf中,从键盘输入的全部数据,不管是数字、字母,仍是空格、回车、Tab等字符,都会被当作数据存入缓冲区。存储的次序是先输入的排前面,后输入的顺次往后排。按回车键的时分scanf开端进入缓冲区取数据,从前往后顺次取。

但scanf中%d只辨认“十进制整数”。对%d而言,空格、回车、Tab键都是区分数据与数据的分隔符。当scanf进入缓冲区中取数据的时分,假如%d遇到空格、回车、Tab键,那么它并不取用,而是越过继续往后取后边的数据,直到取到“十进制整数”停止。关于被越过和取出的数据,体系会将它从缓冲区中释放掉。未被越过或取出的数据,体系会将它一直放在缓冲区中,直到下一个scanf来获取。

可是假如%d遇到字母,那么它不会越过也不会取用,而是直接从缓冲区跳出。所以上面这个程序,尽管scanf进入缓冲区了,但用户输入的是字母a,所以它什么都没取到就出来了,而变量i没有值,即未初始化,所以输出便是–858993460。

但假如将%d换成%c,那么任何数据都会被当作一个字符,不管是数字仍是空格、回车、Tab键它都会取回。

不但如此,前面讲过,你从键盘输入123,这个不是数字123,而是字符’1’、字符’2’和字符’3’,它们顺次摆放在缓冲区中。由于每个字符变量char只能放一个字符。所以输入“123”之后按回车,scanf开端进入缓冲区,依照次序,先取字符’1’,假如还要取就再取字符’2’,以此类推。

假如都取完了还有scanf要取数据,那么用户就需求再输入。先写一个程序看一下:

#include

intmain(void)

{

chari,j,k;

scanf(“%c%c%c”,&i,&j,&k);

printf(“i=%c,j=%c,k=%c\n”,i,j,k);

return0;

}

在VC++6.0中的输出成果是:

123

i=1,j=2,k=3

从这个程序中咱们看出,就单纯地输入123,不加任何空格,按回车键之后就同咱们所讲的相同,分别将字符’1’、字符’2’和字符’3’赋给字符变量i、j和k。

可是需求提醒咱们留意的是,在之前程序中,由于scanf是%d,所以a没有被取出来,还在缓冲区中。当遇到下一个scanf是%c时它就会被取出来。可是假如一直没有出现%c,那么这时就会出现一个问题:scanf怎么取十进制整数?即使运用%d,可是由于字符a“挡”在最前面,scanf进去先碰到的总是a,也就无法取到它后边的整数,所以有必要先将a“弄走”。这就牵涉到“清空输入缓冲区”的概念,这个稍后再讲。

3)在运用scanf之前运用printf提示输入

咱们想一想,前面写的scanf程序有没有缺乏的当地?

程序写好之后,编译、链接、执行,然后弹出黑窗口,出现一个光标在那不停地闪。关于编写程序的人来说他知道要输入什么,可是关于用户而言,用户怎么知道是什么意思呢?所以之前的程序都缺少提示信息!因此在运用scanf之前,最好先用printf提示用户以什么样的方法输入,这样能够大大提高代码的质量。看看下面这个程序:

#include

intmain(void)

{

inti,j;

printf(“请输入两个值,中心以空格分隔:”);

scanf(“%d%d”,&i,&j);

printf(“i=%d,j=%d\n”,i,j);

return0;

}

这样在执行的时分,用户一看就知道是要输入两个值,然后中心用空格离隔。所以这样写就更人性化、智能化了。

© 版权声明
THE END
喜欢就支持一下吧
点赞68赞赏 分享
评论 抢沙发

请登录后发表评论