笔者是一名c语言初学者。在学习《c primer plus》时关于getchar()和缓冲区产生了疑惑。疑惑点在于是否每次执行getchar()时都要从用户处获取一次内容,倘若是这样的话,那么它是从用户输入中获取第一个字符,还是从缓冲区中呢?因此,笔者对于此疑惑进行了实验,解答了心中的疑惑。
1.当缓冲区中没有内容时,getchar()会要求用户输入内容(输入的内容存放在缓冲区中),并从缓冲区中读取第一个字符。然后缓冲区中的剩余的内容并未被getchar()获取,仍然留在缓冲区中(包括换行符)
2.当缓冲区中有内容时,getchar()并不会要求用户输入内容,而是直接从缓冲区中获取第一个字符。
需要强调的是,当执行到getchar()这条语句时,只有当缓冲区清空时才会要求用户输入,否则不会。注意,getchar()只会读取缓冲区中的第一个字符
感谢大家阅读,笔者水平有限。如若有不足,烦请各位指出,不胜感激。如若有疑问,可在评论区垂询。
2020.11.12补充:对于scanf_s,如果%c前面没有空格,是和文中的getchar()一样的。(从大佬的一篇博客中看到的,再加上一点)
2020.11.13补充:对于会跳过空白字符的输入函数,如sanf_s中的%d,在遇到缓冲区中的空白字符时会跳过,并且这个空白字符会被清除出缓冲区。但是如果遇到不匹配的输入,这个不匹配的输入会被留在缓冲区,等待下一个输入函数的出现。另外需要注意的是,根据《c primer plus第六版》p81,scanf_s的%d如果遇到了非匹配输入,如字母,会认为到达了整数的末尾,将字母留在缓冲区,而这次scanf_s的赋值会失效,继续执行下一条语句。如果缓冲区中此时有一个非匹配输入,后面有一群scanf_s的%d,那么这些scanf_s都会失效,无法赋值,继续执行后面的语句。
2020.11.14补充:在窗口端的输入本质上是 把输入的内容放在缓冲区中。然后scanf_s等输入函数从缓冲区中获取自己想要的内容。所以说,如果有三个scanf_s的%d,只要在窗口处一次性输入1 2 3(必须用空格空开,否则会被视为一个整数),便可不需要再次输入。因为此时缓冲区中的内容已经满足scanf_s的需求了
4.while(getchar()!='\n')
continue;
这个循环语句,会将缓冲区中剩余的所有内容都清除(包括最后的换行符)。因为该语句会一个字符一个字符的读取,并将读取完的字符清除出缓冲区。