迅闻网
让更多人看到你

c语言scanf(c语言scanf后面不执行)

  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中的“输出参数”是不带取地址符的,不要混淆了。
运用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只会取一个数据。所以变量ch有数据,变量i没有数据,再加上变量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;
}
这样在执行的时分,用户一看就知道是要输入两个值,然后中心用空格离隔。所以这样写就更人性化、智能化了。

 

scanf

c语言scanf后面不执行

1、C言语是一门面向过程、抽象化的通用程序设计言语,广泛应用于底层开发。C言语能以简易的方式编译、处理低级存储器。C言语是仅产生少量的机器言语以及不需要任何运转环境支撑便能运转的高效率程序设计言语。
?
2、C言语中有三种类型的程序结构分别是:次序结构、挑选结构、循环结构。其中,次序结构便是自始至终—句接着—句的执行下来,直到执行完最终—句。挑选结构是到某个节点后,会依据—次判别的成果来决定之后向哪—个分支方向执行。
3、拓宽材料:代码便是程序员用开发工具所支撑的言语写出来的源文件,是一组由字符、符号或信号码元以离散方式表示信息的清晰的规则系统。代码设计的原则包含唯一确定性、标准化和通用性、可扩充性与稳定性、便于辨认与回忆、力求短小与格式统一以及容易修正等。

未经允许不得转载:迅闻网 » c语言scanf(c语言scanf后面不执行)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

迅闻网-让更多人看到你

登录/注册返回首页