C语言python scanf函数数输入时键盘缓冲区\n的问题

n的问题、C语言scanf函数输入时键盘缓冲区&#92_编程_探探数码问答网
n的问题、C语言scanf函数输入时键盘缓冲区&#92
编辑: 探探数码问答网 &&&来源:用户发布&&&发布时间:&&&查看次数:52
谁了解n的问题、C语言scanf函数输入时键盘缓冲区激哇&#92?谢谢哇。
【探讨解答】
c语言中scanf有什么作用?
C语言中scanf是标准库函数,主要用来接收用户输入的数据。 函数格式:int scanf(char *format, args, ...); 功 能:从标准输入设备按format指定格式输入数据给args所指向的内存单元 返 回 值 :读入并赋给args的数据个数。遇文件结束返回EOF,出...
C语言scanf函数多一次换行问题
int main() { FILE* char ch,filename[10]; printf("please enter f...所给图示中的红线处的这一行,是因为scanf语句中键盘输入的回车存在于缓存中造成的。而getch正好把缓存中的回车清除了。
C语言scanf函数输入时键盘缓冲区\n的问题
你好!我想请教你关于利用scanf函数输入时,留在键盘缓冲区的\n(ASCII值...你首先要明白,从键盘读入键盘缓冲区(buffer)的数据都是以ASCII码存储的(包括回车)。 程序1 #include "stdio.h" void main() { scanf("%d",&a); scanf("%d",&b); printf("%d %d",a,b); } 键盘输入 97 第一次回车后,buffer中...
更多相关内容
本站内容来自网友发布,本站无法保证其部分内容的正确性,请用户一定仔细辨别。
[] &&[联系QQ:885&971&98] &
沪ICP备号&百度知道上看到的关于scanf函数缓冲区的问题,很详细!!
你好!我想请教你关于利用scanf函数输入时,留在键盘缓冲区的\n(ASCII值为10)的问题。期待你的回答。至于分数,你想要多少,说就行。我昨晚写程序时对scanf在键盘缓冲区留下的字符有疑问,思考不果。看了百科上的scanf词条,说scanf输入遇到空格、跳格、回车才会从缓冲区往变量送字符。于是自己写了以下几个程序思考,还是不果。
#include &stdio.h&
void main()
scanf(&%d&,&a);
scanf(&%d&,&b);
printf(&%d %d&,a,b);
97&回车&96&回车&
问题1:调用第一个scanf输入时,键盘缓冲区所有的字符为97\n,遇到回车,所以缓冲区把97赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为96\n,遇到回车,所以缓冲区把96赋值给b。以上我的分析对吗?
#include &stdio.h&
void main()
scanf(&%c&,&a);
scanf(&%c&,&b);
printf(&%d %d&,a,b);
问题2:调用第一个scanf输入时,键盘缓冲区所有的字符为9\n,遇到回车,所以缓冲区把9赋值给a。调用第二个scanf输入时,键盘缓冲区所有的字符为\n,遇到回车,所以缓冲区把\n赋值给b。以上我的分析对吗?如果对,那程序1中调用第一个scanf时,又为什么不是把97赋值给a后,将\n赋值给b呢?为什么调用第二个scanf时还需要继续输入96&回车&来对b赋值?调用第一个scanf输入时留在缓冲区的\n去哪里了?无端消失了?
#include &stdio.h&
void main()
char a[100];
char b[100];
scanf(&%s&,a);
scanf(&%s&,b);
printf(&%s %s&,a,b);
abc&回车&def&回车&
问题3:从输出结果可以看出,字符数组a和字符数组b都在同一行输出。所以字符数组a的值为{‘a’,’b’,’c’},不是{‘a’,’b’,’c’,’\n’}。字符数组b的值为{‘d’,’e’,’f’},不是{‘\n’,‘d’,’e’,’f’},也不是{‘\n’,‘d’,’e’,’f’,’\n’}。以上的分析对吗?如果对,那调用第一个scanf输入时留在缓冲区的\n去哪里了?还有第二个scanf留下\n呢?
#include &stdio.h&
void main()
for(i=0;i&2;i++)
scanf(&%c&,&j);/*注意这里%前没有空格*/
printf(&%d&,j);
#include &stdio.h&
void main()
for(i=0;i&2;i++)
scanf(& %c&,&j);/*注意这里%前有一个空格*/
printf(&%d&,j);
问题4:程序4应该就像程序2那样,最后把\n(ASCII值为10)赋值给j了,所以输出10。但程序5 scanf里那个空格如何阻止\n给j赋值?想不通,恳请赐教!
#include &stdio.h&
void main()
scanf(&%c&,&a);
scanf(&%c&,&b);
printf(&%d %d&,a,b);
问题5:这个问题和\n无关的,但写了程序1,却发现了这个问题。我用的是VC6,就算不是VC6,C的任何编译软件里int和char不都是通用的吗?为什么程序1用%d格式能正常获得char型变量,但程序6用%c格式却不能正常获得int型变量?
我知道我问得的确很多,但非常期待您的回答!想要多少分数,你开口就行,我有多少就给多少,反正能学到东西才是重要的!感谢!!!
16:22提问者采纳
你首先要明白,从键盘读入键盘(buffer)的数据都是以ASCII码存储的(包括回车)。
#include &stdio.h&
void main()
scanf(&%d&,&a);
scanf(&%d&,&b);
printf(&%d %d&,a,b);
第一次回车后,buffer中的ASCII:39h,37h,0AH(0A是换行的ASCII), scanf会根据格式字符串中的第一个%d对buffer按读取,当读取到0A时,认为%d型的数据结束,此时把已经读取到的39h,37h依据%d转为97存储在字符型变量a中。(这里是除去了扫描截止点0AH)
此时buffer中已经无任何数据了。
第二次回车后,按同样的流程,scanf会根据格式字符串中的第二个%d对buffer按读取。最终b得到96.
此时buffer中已经无任何数据了。
#include &stdio.h&
void main()
scanf(&%c&,&a);
scanf(&%c&,&b);
printf(&%d %d&,a,b);
9&回车&buffer:39H,0AH
因为scanf会按照第一个%c格式扫描buffer(只扫描一个字节就结束),然后把扫描到的39H直接送到变量a(当以%d格式读出来时,39H就是57)
此时,buffer中只有:0AH。
然后,scanft又遇到第二个%c,继续扫描buffer,得到0aH并送入变量b.
此时buffer中已经无任何数据了
#include &stdio.h&
void main()
char a[100];
char b[100];
scanf(&%s&,a);
scanf(&%s&,b);
printf(&%s %s&,a,b);
第一次回车后,buffer:61H,62H,63H,0AH。
scanf会按照%s的格式对buffer按扫描,当扫描到0AH时,结束扫描(按照%s的要求,空格20H也是扫描结束点)。
然后把扫描到的(除去最后一个判断扫描截至的字节0AH)数据直接送入以a为起始地址的字符串。
此时,buffer无任何数据了。
第二次回车后,buffer:65H,66H,67H,0AH.扫描的流程与上面的完全一致。
#include &stdio.h&
void main()
for(i=0;i&2;i++)
scanf(&%c&,&j);/*注意这里%前没有空格*/
printf(&%d&,j);
这里scanf执行了两次(i==0时,与i==1时),而且每次都是想对j赋值。
第一次scanf,按%c的要求,只扫描buffer中的一个字节,但是buffer中并不数据,于是要求键盘输入数据到buffer,此时的1&回车&代表向buffer中输入了:31H,0AH。
然后按%c的要求,只扫描buffer中的一个字节:31h,并将它直接送入变量j.
此时,buffer中还留下:0AH。
第二次scanf要求键盘输入数据,按%c的要求,只扫描buffer中的一个字节:0Ah,并将它直接送入变量j.
此时,buffer无数据了。
最后,你用%d格式输出j的值(0AH换成整型就是10)
#include &stdio.h&
void main()
for(i=0;i&2;i++)
scanf(& %c&,&j);/*注意这里%前有一个空格*/
printf(&%d&,j);
1&回车&2&enter&的情况:
scanf会按照格式串的要求,顺序扫描buffer.
但是你其中有一个空格,这个很特殊,我也是第一次发现这个问题(一般我都不会在scanf中加入任何字符)
我测试了一下:我发现这个空格有吸收回车(0AH)和空格(20H)的“神奇功效”,吸收之后再要求buffer给一个字节,直到这个字节不是0AH或者 20H,此时把这个字节交给下一个格式字串。
第一次循环时遇到格式字串空格,就扫描buffer中的一个字节,但是buffer中无数据,要求从键盘输入数据:1〈回车〉,buffer中有数据了——31H,0AH。再读取到字节31H,scanf发现这个并不是0AH/20H,就把这个字节31H交给格式字符%c处理。
循环结束,此时buffer里面还有:0AH.
第二次循环时遇到格式字串空格,就扫描buffer中的一个字节——0AH,发现是0AH/20H,于是就要求buffer再来一个字节。此时buffer里面已经没有数据了,要求键盘输入:2&enter&.
buffer中有数据了——32H,0AH。于是再读一个字节31H,scanf发现这个并不是0AH/20H,就把这个字节32H交给格式字符%c处理(j最终得到32H)。
循环结束,此时buffer里面还有:0AH.
这里有一篇关于Printf的帖子:
#include &stdio.h&
void main()
scanf(&%c&,&a);
scanf(&%c&,&b);
printf(&%d %d&,a,b);
你的编译器VC认为%d数据应该是4个字节,但是你采用的是%c读数据,
scanf(&%c&,&a);此到的是1的ascii码:31h.然后把31H直接送入地址&a(而并没有改写a的三个高字节地址)。
scanf(&%c&,&b);同理。
你可以用printf(&a=%x,b=%x\n&,a,b);来验证我说的。它们的最低字节肯定是31H,0AH。
当你把放在main()外进行定义时,a,b的初值就是0。此时你会得到正确的结果。
当你把放在main()内进行定义时,a,b不会被初始化(它们的三个三个高字节地址的内容是不确定的),你就会得到上面错误的结果。(定义的动态变量都不会被初始化,会被初始化为0)
PS2:以下也是不正确的用法。
scanf(&%d&,&c);/当你用%d给c赋值时,会对从&c开始的连续4个字节进行赋值。当从buffer得到的值是在一个字节范围内(-128~127),下面是可以正常输出的。但是不管怎样,这样做是很危险的——越界。
printf(&%d&,c);
=================请你测试下这个程序========================
#include &stdio.h&
void main()
char c[4],i=4;
scanf(&%d&,c);/*请输入258&回车&*/
while(i--&0)
printf(&%02x &,c[i]);
printf(&\n&);
}/*如果得到的结果是00 00 00 01 02就说明我的结论是正确的(258的转为16进制数就是00 00 01 02H,然后scanf会把这个数放入以c为起始地址的)
================以下程序也是======================
#include &stdio.h&
void main()
char c,i=4;
char *p=&c;
scanf(&%d&,&c);/*请输入258&回车&*/
while(i--&0)
printf(&%02x &,p[i]);
printf(&\n&);
本文已收录于以下专栏:
相关文章推荐
程序时对scanf在键盘缓冲区留下的字符有疑问,思考不果。看了百度百科上的scanf词条,说scanf输入遇到空格、跳格、回车才会从缓冲区往变量送字符。于是自己写了以下几个程序思考,还是不果。
讨论下scanf函数,输入缓冲区的关系  样例来源于算法竞赛入门经典第一章实验部分的内容,经过测试发现scanf函数对于整形数据在读入时会过滤掉 空格符 、换行符
和 水平制表符。按照提示,如果b的...
在用c语言编写输入语句的时候常用到scanf函数,初学者在刚用scanf函数输入时,经常会遇到各种各样的输入错误,最重要的是一定要记住scanf函数的输入格式,scanf函数里包含了哪些东西,输入的时...
在用c语言编写输入语句的时候常用到scanf函数,初学者在刚用scanf函数输入时,经常会遇到各种各样的输入错误,最重要的是一定要记住scanf函数的输入格式,scanf函数里包含了哪些东西,输入的时...
在用c语言编写输入语句的时候常用到scanf函数,初学者在刚用scanf函数输入时,经常会遇到各种各样的输入错误,最重要的是一定要记住scanf函数的输入格式,scanf函数里包含了哪些东西,输入的时...
摘自:.cn/s/blog_3068.html
scanf()函数中%[]格式控制符用法
时间: 1...
1.任务和代码
给定两个正整数,求出两数的正差值并输出。
1)实现基本功能(V1.0)
/* ********************
函数功能描述:求出两数值正差值
突然想起来c语言中常用的scanf函数还有getchar函数有可能会遇到关于缓冲区未被清空导致输入出现问题的情况。
刚刚学c的时候有道练习题遇到了键盘输入缓冲区出现的问题,然后今天同学做课设题目也遇到...
一、printf函数二、scanf函数
说明:这个C语言专题,是学习iOS开发的前奏。也为了让有面向对象语言开发经验的程序员,能够快速上手C语言。如果你还没有编程经验,或者对...
1.scanf函数的介绍及使用
1)scanf函数是一个阻塞式函数:函数执行后,会等待用户输入,如果用户不输入任何内容,它会一直等待。
2)scanf函数的作用:接收用户从键盘输入的内容,并保存到...
他的最新文章
讲师:王哲涵
讲师:王渊命
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)C语言scanf函数应用问题 - 计算机毕业论文
||||||||||||||||||||||
您现在的位置:&&>&&>&&>&&>&正文阅读次数:人次C语言scanf函数应用问题1.VIP俱乐部2.查看资料3.订阅资料4.在线投稿5.免费阅读6.会员好评7.原创检测8.教材赠送9.联系我们10.常见问题
C语言的输入是由系统提供的库函数完成的。scanf函数是C语言中最常用且功能最强的输入函数,但该函数如使用不慎,就会出现错误或得不到预想的结果。以下结果都是基于VC++6.0运行环境。一、格式说明符和输入项的三对应(类型、个数、顺序)scanf函数格式中的格式说明(“%格式字符”)应与输入项数据类型一致,个数相等、顺序对应(除格式说明中出现“*”附加格式说明字符外)。示例一:inta,b;scanf("%d%d%d",&a,&b);printf("%d,%d",a,b);输入“345”时,输出“3,4”,没有错误提示信息,但是第三个数没有接收的变量,也就没有输出。再如inta,b;scanf("%d",&a,&b);printf("%d,%d",a,b);输入“34”时,输出“3,-”,a得到3,但b是一个随机数,都是因为格式说明(“%格式字符”)与输入项个数不一致造成的。再如structst{charname[10];}scanf("%d,%s,%d,%f",&student);输入“10001,"zhang",23,68”,运行程序时,无出错信息,但student不能正确接收输入数据。应该写成:scanf("%d,%s,%d,%f",&student.num,student.name,&student.age,&stu-dent.score);保证格式说明与输入项个数相等、一一对应,才能使student正确接收输入数据。示例二:chara,b;scanf("%d%d",&a,&b);printf("%d,%d",a,b);输入“34”时,输出“3,4”,输入整型数据,是字符型数据接收,但是结果正确,因为字符型数据在内存中的存放形式是整型数据。再如floata,b;scanf("%d%d",&a,&b);printf("%d,%d",a,b);输入“34”时,输出“0,”,即a和b的结果都是随机数,这就是输入格式和接收的数据类型不一样造成的。又如:inta,b;scanf("%f%f",&a,&b);printf("%d,%d",a,b);输入“1.23.4”时,输出“,”,即a和b的结果都是随机数,这也是输入格式和接收的数据类型不一样造成的。二、非格式说明符的输入非格式说明符要求用户原样照写输入,既不能更改,又不能漏写。示例一:inta,b;scanf("a=%d,b=%d",&a,&b);printf("%d,%d",a,b);输入“12”(即1、2间用空格隔开),输出“-,-”,无错误提示,但结果与输入数据不一致,输出a、b的值是随机数。这就是因为scanf函数中设定的格式(“a=%d,b=%d”)(其中a=,b=均为普通字符)与输入数据的格式(1、2间用空格间隔)不一致造成的,正确的输入形式应为“a=1,b=2”(“,”也绝不能漏掉)。所以,为了保证正确输入数据,输入数据前首先看好程序中scanf函数设定的格式,再按照设定的格式正确输入数据。示例二:scanf("%d,%d",&a,&b);输入时应用以下形式:3,4↙注意3后面应是逗号,它与scanf函数中的“格式控制”中的逗号对应。如果输入时不用逗号而用空格或其他字符是不对的。3□4↙(不对)3:4↙(不对)如果是scanf("%d□□%d",&a,&b);则输入时两个数据间应空两个或更多个空格字符。如:3□□4↙或3□□□□4↙三、附加格式说明符的说明示例一:inta,b;scanf("%2d%2d",&a,&b);printf("%d,%d",a,b);输入“1234”,输出“12,34”输入“123”,输出“12,3”输入“123456”,输出“12,34”因为格式中“d”格式字符表示输入整型数据,“2”附加格式说明字符表示输入数据所占宽度为2,因此,无论用户输入什么,系统都将自动截取两位赋给a,再截取两位赋给b。也就是说可以用附加格式说明符指定输入数据所占列数,系统将自动按它截取所需数据。再如scanf("%3c",&ch);如果从键盘上连续输入3个字符abc,由于ch只能容纳一个字符,系统就把第一个字符‘a’赋给ch。示例二:scanf("%5.1f",&a);输入“1234”,无错误提示,但a并不能接收输入数据,输出a的值为随机数,再尝试输入别的数据,结果都为随机数。用户本意想用这样的scanf格式输入宽度为5位,小数部分为1位的小数,但得不到预想结果。因为,scanf函数中只有“域宽”(此处为5)附加格式说明字符(指定输入数据所占列数),而没有在“小数位数”附加格式说明字符(只有printf函数有),应该去掉“.1”,即scanf("%5f",&a);或scanf("%f",&a);均可,此时输入“123.4”即可接收。所以,应根据scanf函数中规定的格式字符及其附加格式说明字符使用,不能滥用,输入数据时不能规定精度。示例三:scanf("%f",&x);输入“123.4”,输出x的值为随机数,没有接收输入的数据,再输入别的数据,结果都为随机数。这是因为用户定义x为双精度型数据,而用“%f”格式输入数据时,不能接收,应该使用“%lf”或“%le”,即scanf("%lf",&x);此时输入“123.4”即可接收。因此长整型数据和双精度型数据必须使用附加格式说明字符l,短整型数据必须使用附加格式说明字符h。示例四:inta,b;scanf("%2d,%*3d,%2d",&a,&b);输入“12,345,67”,此时,12赋给a,67赋给b。注意:原则上“,%格式字符”应与“输入项”(&a,&b)个数相等,一一对应,此处则出现了个数不等的情况(“%格式字符”项数为3,而输入项数为2)。因为scanf函数中有附加格式说明字符“*”,加“*”项表示输入的数据不赋给相应变量,因此输入的“345”被跳过,接收下一个数据(“67”),致使“%格式字符”与“输入项”个数可以不等的情况出现。在利用现成的一批数据时,有时不需要其中某些数据,可用此法跳过它们。例如scanf("%c%c",&a,&b);printf("%c%c",a,b);输入A□B↙,输出A□‘,A’给了字符变量a‘,□’作为合法字符给了字符变量b。这时我们改用scanf("%c%*c%c",&a,&b);输入A□B↙,输出AB,‘A’给了字符变量a‘,□’被%*c跳过‘,B’就给了字符变量b。可见,使用scanf函数时,要在scanf规定的格式字符及其附加格式说明字符下使用。既不能不用,又不能滥用。四、注意输入结束标志①遇到空格,或者回车键,或者Tab键。如果相邻两个格式指示符之间,不指定数据分隔符(如逗号、冒号等),则相应的两个输入数据之间,至少用一个空格分开,或者用Tab键分开,或者输入一个数据后,按回车,然后再输入下一个数据。在用“%c”格式输入字符时,空格字符和“转义字符”都作为有效字符输入。示例一:scanf("%d%d",&num1,&num2);假设给num1输入12,给num2输入36,则正确的输入操作为:12□36↙或者:12↙36↙示例二:scanf("%c%c%c",&c1,&c2,&c3);如果从键盘输入a□b□c↙则字符‘a’赋给c1,字符‘□’赋给c2,字符‘b’赋给c3。因为%c只要求读入一个字符,后面不需要用空格作为两个字符的间隔空格,因此空格作为下一个字符赋给c2。故应该从键盘输入abc↙②遇到输入域宽度结束。例如“%3d”,只取3列。示例一:scanf("%3d",&num1);如果从键盘输入12345↙,则num1的值为123。③遇到非法输入。例如,在输入数值数据时,遇到字母等非数值符号(数值符号仅由数字字符0-9、小数点和正负号构成)。示例一:scanf("%d%c%f",&a,&b,&c);若输入↙第一个数据对应%d格式在输入1234之后遇到的字母a,因此认为1234之后已没有数字了,第一个数据到此结束,把1234送给变量a。字符‘a’送给变量b,由于%c只要求输入一个字符,因此输入字符a后不需要加空格,后面的数值应送给变量c。如果由于疏忽把本来应为1230.26错打成123o.26,由于123后面出现字母‘o’,就认为该数值数据到此结束,把123送给c。五、注意输入项scanf函数中的“格式控制”后应当是变量地址,而不是变量名。示例一:scanf("%d",&x);该格式中x前必须加地址符&表示x所在的地址,即输入数据所在的位置,如写成intx;scanf("%d",x);则出现写内存错误,无法运行.exe应用程序。也有人常在数组名前加地址符&。示例二:charc[10];scanf("%s",&c);这也是错误的。因为数组名表示数组的起始地址,已经指出输入数据的位置了,再使用地址符&即成为二级指针,意义截然不同,应改为charc[10];scanf("%s",c);因此,scanf函数中的“格式控制”后面只要写成指针型(一级指针)数据指出输入数据所在的位置即可,不能机械搬用,要明确实际含义。
本文永久链接:上一篇论文: 下一篇论文:
关于本站:中国最大的权威的公务员门户网站-公务员之家创建历经7年多的发展与广大会员的积极参与,现已成为全国会员最多(95.4万名会员)、文章最多、口碑最好的公务员日常网站。荣膺搜狐、新浪等门户网站与权威媒体推荐,荣登最具商业价值网站排行榜第六位,深受广大会员好评。公务员之家VIP会员俱乐部在公务员之家您可以分享到最新,最具有时事和代表性的各类文章,帮助你更加方便的学习和了解公文写作技巧,我们愿与您一同锐意进取,不懈的追求卓越。如何加入公务员之家VIP会员第一步:先了解公务员之家,查看第二步:或在线支付,汇款即时到帐第三步:汇款后立刻,将您的汇款金额和流水号告诉客服老师,3分钟内系统核查完毕并发送VIP会员帐号到您的手机中,直接登陆即可。百度推广

我要回帖

更多关于 scanf函数 的文章

 

随机推荐