
为什么这个要不早getchar()来吸收回车键都能正确的执行,而很多情况下没有getchar就会错
为什么这个要不早getchar()来吸收回车键都能正确的执行,而很多情况下没有getchar就会错误,那得在什么情况才能正确的使用呢,谢谢!...
为什么这个要不早getchar()来吸收回车键都能正确的执行,而很多情况下没有getchar就会错误,那得在什么情况才能正确的使用呢,谢谢!
展开
3个回答
展开全部
要弄清楚这个问题,首先要理解输入缓冲区的的原理。
所谓的输入缓冲区是一块内存,用来存放你输入的字符串。scanf和gets等输入函数都是从缓冲区内读取数据的,读取的同时会把读取到的从缓冲区内删除;如果缓冲区的数据读取完了就会停下,等待用户输入,当用户输入的时候,程序是停止的,这时用户可以随意输入字符串,甚至还能退格,这个时候getchar也好scanf也好,都还没有运行。只有当用户输入回车了之后,这行数据才能放到缓冲区内,一旦缓冲区内有了数据,getchar就会继续运行了,如果输入了多个字符,缓冲区有足够的数据供给getchar,所以getchar第二次以及之后的运行就不会停下来等待输入了。
再详细说一下scanf,如果用"%d"这种格式输入,因为是整数,如果遇到0-9这十个数字字符,则会接受这些字符,并且从缓冲区删除接受的字符,如果遇到其他字符,则scanf运行结束,注意这时,其他字符并没有从缓冲区内删除,如果再次运行scanf("%d")的话,则从缓冲区看到的字符还是非数字字符,无法得到整数,跳过,但缓冲区内还有字符,所以不会停下来等待用户输入,所以就造成了一直运行scanf的死循环。
所谓的输入缓冲区是一块内存,用来存放你输入的字符串。scanf和gets等输入函数都是从缓冲区内读取数据的,读取的同时会把读取到的从缓冲区内删除;如果缓冲区的数据读取完了就会停下,等待用户输入,当用户输入的时候,程序是停止的,这时用户可以随意输入字符串,甚至还能退格,这个时候getchar也好scanf也好,都还没有运行。只有当用户输入回车了之后,这行数据才能放到缓冲区内,一旦缓冲区内有了数据,getchar就会继续运行了,如果输入了多个字符,缓冲区有足够的数据供给getchar,所以getchar第二次以及之后的运行就不会停下来等待输入了。
再详细说一下scanf,如果用"%d"这种格式输入,因为是整数,如果遇到0-9这十个数字字符,则会接受这些字符,并且从缓冲区删除接受的字符,如果遇到其他字符,则scanf运行结束,注意这时,其他字符并没有从缓冲区内删除,如果再次运行scanf("%d")的话,则从缓冲区看到的字符还是非数字字符,无法得到整数,跳过,但缓冲区内还有字符,所以不会停下来等待用户输入,所以就造成了一直运行scanf的死循环。
更多追问追答
追问
额…有点看不懂,能用再通俗一点的语言吗,谢谢
追答
哪里不懂问哪里。通俗一点?你是要我重写一遍的节奏啊
展开全部
因为 scanf() 语句在前,getchar() 在后,两者无关,有无 getchar() 不影响 scanf()。
“很多情况下没有getchar就会错。”
没有很多。
scanf() 默认 以空白 作 输入量的分隔符,自动跳过 空格,tab, 回车,新行键。
就算 scanf() 语句接 scanf() 语句 也 不需要getchar()。
getchar()常用在: scanf() 后接 gets() 这种情况
这时需要getchar() 吃掉1个 回车,使 gets() 正确地读到一行字符串。
“很多情况下没有getchar就会错。”
没有很多。
scanf() 默认 以空白 作 输入量的分隔符,自动跳过 空格,tab, 回车,新行键。
就算 scanf() 语句接 scanf() 语句 也 不需要getchar()。
getchar()常用在: scanf() 后接 gets() 这种情况
这时需要getchar() 吃掉1个 回车,使 gets() 正确地读到一行字符串。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
getchar()的作用就是为了让程序保持接收a的输入,如果没有getchar(),程序一开始就会直接运行到末尾,不停留给我们输入a值的时间
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询