C语言中scanf的问题(想半天了,还是想不通)

在scanf函数中,回车键不是代表,开始匹配,开始读取缓冲区中的数据吗?

img

img


这两张图,第一张图,我直接%d%d,结果这两个数据之间就可以用回车键分开。
第二张图,我用a=%db=%d。结果当我输入a=10以后按回车,它就直接开始读取缓冲区数据了!
为啥啊,为什么第一个图片,按回车,不会立刻开始运行scanf。而第二个图片,按回车直接开始运行scanf了。

img


这张图,当scanf函数里,加了一个\n,,无论怎么按回车,它都不会结束,必须要输入一个非空字符才能继续运行。
我看了很多解释,可还是不理解,我不知道,\n存入缓存区后,按回车,为啥不会开始运行scanf,而是永远不会结束。。
为什么输入一个非空字符,就结束了?是scanf函数匹配不成功,而强制退出了??

本人不是大佬,不懂编译的底层原理,就单纯说说自己的看法

img


img


有此可见当输入与输入格式不相符时scanf强制结束了

img


img


由此比较可知,scanf强制退出以后,输入依旧保存在缓存区,等待下一个scanf读入

img


img


由此可见,你虽然敲了回车,但你的第一个scanf还处于执行的状态,而恰巧空字符串他又不做任何处理

总结,能这样思考钻研确实是一件非常好的事情,但对于细枝末节的事情,以砸门的程度,不必过于最牛角尖,知道砸门用就行。

    printf("%d", printf("%d",20221101));

又是新一月的开始,注意身体,早点休息~

  • 输入格式%d会忽略前导空白符(包括空格、tab和回车)
  • 如果输入格式中含有空白符(包括空格、tab和回车),那么它将匹配输入流中任意连续的空白符
  • 输入格式中其他非空白字符(除%外),必须精确匹配

https://en.cppreference.com/w/c/io/fscanf

  • non-whitespace multibyte characters except %: each such character in the format string consumes exactly one identical character from the input stream, or causes the function to fail if the next character on the stream does not compare equal.
  • whitespace characters: any single whitespace character in the format string consumes all available consecutive whitespace characters from the input (determined as if by calling isspace in a loop). Note that there is no difference between "\n", " ", "\t\t", or other whitespace in the format string.
  • All conversion specifiers other than [, c, and n consume and discard all leading whitespace characters (determined as if by calling isspace) before attempting to parse the input.

scanf 中%d后面也没有必要加\n,因为在 scanf 中\n不起换行的作用。它不但什么作用都没有,你还要原样将它输入一遍。

看这篇文章非常非常详细,一定能解决你的一些问题。

《C语言scanf函数用法完全攻略》, 一起来围观吧 https://blog.csdn.net/weixin_43025071/article/details/98959744?utm_source=app&app_version=5.0.1&code=app_1562916241&uLinkId=usr1mkqgl919blen

实际上第一种写法%d%d最好,第二种要实际和scanf内容输入一样才能被读取,拿第一种来说
scanf读取数字字符时一开始缓存区读取如果是间隔字符回车空格或者tab键时会跳过并释放,直到读取到数字字符后开始依次往后读取,直到遇到间隔符会讲读取到的数字读初缓存区,此时第一个%d读取到了按回车前的数字,然后再进入缓存区读取数字字符给第二个数字,刚进缓存区遇到的是读取的前面数字字符按的回车会跳过并释放,期间你按多少回车空格tab都是会跳过释放的,知道你输入了数字最后按回车会读取这些数字直到间隔符后停止讲这些数字字符转换为数字给第二个变量,注意期间如果是非数字字符也会出缓存区,但是读取数字字符时遇到非数字字符会停在那里既不会跳过也不会被释放