对于刷oj时因为scanf()出现wa而cin却AC的详解 【scanf() 和 cin 详解】
故事还得从昨天讲起,昨天做了一道题及其的诡异,用cin输入AC了。用scanf()却一直的报错或者陷入了
死循环。这让我很费解,我用了fflush(stdin)来排除,发现没有效果。后来我想起之前写过关于scanf()的原理详解的文章。
又看了一看才猛然发现了其中的原理。
c语言scanf()函数的原理
问题描述
随便的举个例子:
输入一个5x5的字符矩阵,然后让你原样输出
我们在做题的时候,有时候会遇到上面的那种多行的输入,我们一般为了方便的调试看我们的代码。
一般习惯直接复制案例,然后粘贴到我们的控制它窗口。
例如:
你会看到用cin读取的时候,我们的输出和输入是一模一样的。
接下来看一下用scanf()会发生什么。
这TM的是什么鬼?
接下来看一下原理解析。
原理解析
首先,要明白的一点就是我们在输入的时候,输入的数据并不会立刻的赋值,而是进入了一个缓冲区。
然后我们从缓冲区里挨个的提取然后赋值。
当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,
那么敲入的这个回车键(\r)会被转换为一个换行符\n。
对于: cin
当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符(换行)是残留在缓冲区的,cin>>不做处理。
那么根据上面cin读取的概念换行符会省略过去,读取的过程是这样的。
那么此时缓冲区里还有的内容是:
究竟缓冲区里有没有换行符我们来实验一下就知道了。
观察一下: a=getchar()我们是没有输入的,你可以看到它已经直接从缓冲区里拿了字符,且是一个换行。
那么如果我们再 a=getchar()前 fflush(stdin)清空缓冲区一下,我们就得输入了。
从上图,你会发现当我们fflush(stdin)清空缓冲区后,此时得缓冲区已经没有东西了,那么我们就得输入了。
对于: scanf()
scanf()它是可以控制参数的,且scanf对不同的参数表现出来的特性不一样。当参数是 %d %lf %f %s 等,只要不是%c它都是省略空格,换行等一些空白符的。但是对于%c它就可以读取空白符例如: 换行,空格等。
那么根据上面scanf()读取的概念,读取的过程是这样的。
scanf("%c")会将换行也一起读取,于是就产生了最上面的问题。
那么此时的缓冲区有:
还是用上面的方法实验一下:
你会发现此时的缓冲区确实有4个E 还没有读取。
最后
好了,终于真相大白。我是辉小歌,你可以叫我小歌。一个菜鸟程序员。
如果本文对你有帮助的话,请点赞,关注,加收藏。我们下次再见。
ps: 还是第一次拉票。
总结
以上是生活随笔为你收集整理的对于刷oj时因为scanf()出现wa而cin却AC的详解 【scanf() 和 cin 详解】的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: is_sorted() 函数---一个判
- 下一篇: 第六章:双指针,BFS,和图论 【完结】