scanf和getchar共用输入缓冲区会导致什么问题?如何解决?

2026-04-11 23:171阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计323个文字,预计阅读时间需要2分钟。

scanf和getchar共用输入缓冲区会导致什么问题?如何解决?

c#include

scanf和getchar共用输入缓冲区会导致什么问题?如何解决?

int main() { char password[20]={0}; scanf(%s, password); printf(您的密码将设置为%s,请确认\n, password); int i=0; i=getchar(); switch (i) { case 'y': printf(已确认\n); break; case 'n': printf(已删除\n); break; } return 0;}

假设有如下代码

int main() { char password[20] = { 0 }; scanf("%s", password); printf("你的密码将设置为%s,请确认\n", password); int i = 0; i = getchar(); switch (i) { case 1: printf("已确认\n"); break; case 0: printf("已删除\n"); break; default: printf("请输入1或0\n"); break; } return 0; }

一、bug

当我们运行代码在scanf处输入123后,代码直接执行完毕,并没有等我们在getchar处输入,而是直接执行了switch里

的default。

二、产生原因

在scanf处我们敲下了123和一个回车键,它们以“123\n”储存在输入缓冲区,scanf读走了123,缓冲区还剩一个\n,被getchar直接读取(\n的ASCLL码值为10,非0或1,所以会执行default)

三、解决方法

在scanf和getchar之间加一行代码

while ((getchar()) != '\n') { ; }

一直执行getchar直至把输入缓冲区的内容取完


为什么不能只用一次getchar把\n取走就好,而要用while语句一直取,直到把\n取走?

因为有一些情况:当密码输入123 456时,scanf只读取123,后面的“空格”+“456”+“\n”一次取不完,需要用while+getchar取干净。


本文共计323个文字,预计阅读时间需要2分钟。

scanf和getchar共用输入缓冲区会导致什么问题?如何解决?

c#include

scanf和getchar共用输入缓冲区会导致什么问题?如何解决?

int main() { char password[20]={0}; scanf(%s, password); printf(您的密码将设置为%s,请确认\n, password); int i=0; i=getchar(); switch (i) { case 'y': printf(已确认\n); break; case 'n': printf(已删除\n); break; } return 0;}

假设有如下代码

int main() { char password[20] = { 0 }; scanf("%s", password); printf("你的密码将设置为%s,请确认\n", password); int i = 0; i = getchar(); switch (i) { case 1: printf("已确认\n"); break; case 0: printf("已删除\n"); break; default: printf("请输入1或0\n"); break; } return 0; }

一、bug

当我们运行代码在scanf处输入123后,代码直接执行完毕,并没有等我们在getchar处输入,而是直接执行了switch里

的default。

二、产生原因

在scanf处我们敲下了123和一个回车键,它们以“123\n”储存在输入缓冲区,scanf读走了123,缓冲区还剩一个\n,被getchar直接读取(\n的ASCLL码值为10,非0或1,所以会执行default)

三、解决方法

在scanf和getchar之间加一行代码

while ((getchar()) != '\n') { ; }

一直执行getchar直至把输入缓冲区的内容取完


为什么不能只用一次getchar把\n取走就好,而要用while语句一直取,直到把\n取走?

因为有一些情况:当密码输入123 456时,scanf只读取123,后面的“空格”+“456”+“\n”一次取不完,需要用while+getchar取干净。