user-0 提问: windows的换行符

回复:
user: user-1
content: ide的输入输出窗口是ide自己做的一个模拟器， 它的效果未必和exe执行的效果一致的， 毕竟不是同一个东西 比如，再XCode的模拟窗口里面，用输入法就不可用，输入汉字都变成了拼音，而做成发布执行程序就可以输入汉字  c语言就要用c语言的函数规则来理解， 跨到另外一个语言是有助于更好的理解，但是他们毕竟不同，还要注意差异的地方  输入输出在绝大部分程序当中都是重头戏（界面也是输入输出的一种），是要好好研究的， 否则输入都不对，何谈后面的算法执行呢。 初学的人往往都会犯的错误就是不检验输入数据是否正确就开始执行后面的操作，还老抱怨算法不对。  Go语言不太熟悉， 只是拿来做个比喻，希望有帮助吧

user: user-0
content: 引用 8 楼 寻开心的回复:类似输入一个整数后面再回车，而后再输入一个整数的这种情况 Go语言是scanfln函数两次，或者是第一次scanf的时候格式指定尾巴带一个\n,  "%d\n",否则下次的scanf调用遇到它会直接返回  这个机制和c的scanf是不一样的， c里面会把回车当做分隔符，自动过滤掉 我查过这个，也在go论坛问过，但不一定对应最新版本，再举个例子吧，如果用ide编译运行，在ide的输入窗口中输入(这不是终端，编译指令是一致的，和在cmd中运行是一样的，只是换了个地方输入)，可以达到c语言的效果，这在win10和win7下都一样，这一点同样难解释，另外我自学时看到视频里老师的结果都与此相悖，他的结果都是和C一致，当然也是在cmd中的，win7下。另外我知道您讲的在后面加\n的操作，但这样写，当在同一行用空格分隔两个语句输入时，第二段会丢失一个字符，这我想虽然正常讲不该这么输入，但还是需要避免的。感谢您的耐心回答

user: user-1
content: 类似输入一个整数后面再回车，而后再输入一个整数的这种情况 Go语言是scanfln函数两次，或者是第一次scanf的时候格式指定尾巴带一个\n,  "%d\n",否则下次的scanf调用遇到它会直接返回  这个机制和c的scanf是不一样的， c里面会把回车当做分隔符，自动过滤掉

user: user-0
content: 引用 6 楼 寻开心的回复:go语言的语法规则和c语言的语法规则不是你说差不多就差不多的啊 看看它的函数定义吧  再说即便都是c语言，在不同的编译器，不同的版本下函数的实现代码都有可能不相同的 c语言只定义了一些标准， 并没有限定编译器必须如何实现，是有可能造成不同的效果的 大佬，他编译靠自己，独此一家，别无分号，而且我试过把编译好的exe文件复制过去，您别纠结语言啦，这不重要，我想您这意思应该是这两系统的换行符并没有差别，那我去翻翻源码吧，可能实现方式涉及到别的东西吧

user: user-1
content: go语言的语法规则和c语言的语法规则不是你说差不多就差不多的啊 看看它的函数定义吧  再说即便都是c语言，在不同的编译器，不同的版本下函数的实现代码都有可能不相同的 c语言只定义了一些标准， 并没有限定编译器必须如何实现，是有可能造成不同的效果的

user: user-0
content: 引用 3 楼 寻开心的回复:键盘输入什么内容，是键盘驱动程序返回给系统的，系统通过标准的接口来获取输入的内容 scanf你可以看看函数的说明，键盘只有敲入回车的时候，scanf才开始启动接收并处理数据 比如，你scanf指定输入1个整数， 你输入了 1  3   5  7 然后一个回车 scanf做了什么呢， 他把第一个整数提取走了， 后面的字符都给扔了吗？ 并没有， 它是留给下一次的输入使用了 后面你有scanf的代码，还是可以继续从后面获取3，5，7等数据的 所以你的解释扔掉\n是错误的理解  键盘输入的内容是放到一个缓冲区里面的， 叫做键盘缓冲， 它并不是遇到了\n字符，后面就没有数据或者清理了前面的数据 scanf从键盘缓冲提取这些输入的字符，然后来根据指定的格式来提取数据，默认遇到空格，tab和回车都是（除非是%c的格式读取）当做数据的分隔符来处理的，或忽略这些字符找下一个匹配的数据的。 如果你只取一个整数，那么取完数字遇到了分隔符（空格 tab和回车）会如何？ scanf什么都不干，返回了，把分隔符依然留在键盘缓冲区了。 等待下一次scanf发生的时候，它遇到了这些分隔符，它会跳过去找下一个非分隔符的数据的。这就是你感觉第二个数据获取的时候前面的回车被放弃的原因。  getchar是键盘缓冲区里面是什么都直接提取一个返回， 不存在分隔符的说法， 所以能直接获得 要理解scanf的机制就好了  你说的win10和win7的区别，没有看明白你的意思 。  win10和 win7下scanf表现有什么不同了 我试过别的终端，win10下都是这样的

user: user-0
content: 引用 3 楼 寻开心的回复:键盘输入什么内容，是键盘驱动程序返回给系统的，系统通过标准的接口来获取输入的内容 scanf你可以看看函数的说明，键盘只有敲入回车的时候，scanf才开始启动接收并处理数据 比如，你scanf指定输入1个整数， 你输入了 1  3   5  7 然后一个回车 scanf做了什么呢， 他把第一个整数提取走了， 后面的字符都给扔了吗？ 并没有， 它是留给下一次的输入使用了 后面你有scanf的代码，还是可以继续从后面获取3，5，7等数据的 所以你的解释扔掉\n是错误的理解  键盘输入的内容是放到一个缓冲区里面的， 叫做键盘缓冲， 它并不是遇到了\n字符，后面就没有数据或者清理了前面的数据 scanf从键盘缓冲提取这些输入的字符，然后来根据指定的格式来提取数据，默认遇到空格，tab和回车都是（除非是%c的格式读取）当做数据的分隔符来处理的，或忽略这些字符找下一个匹配的数据的。 如果你只取一个整数，那么取完数字遇到了分隔符（空格 tab和回车）会如何？ scanf什么都不干，返回了，把分隔符依然留在键盘缓冲区了。 等待下一次scanf发生的时候，它遇到了这些分隔符，它会跳过去找下一个非分隔符的数据的。这就是你感觉第二个数据获取的时候前面的回车被放弃的原因。  getchar是键盘缓冲区里面是什么都直接提取一个返回， 不存在分隔符的说法， 所以能直接获得 要理解scanf的机制就好了  你说的win10和win7的区别，没有看明白你的意思 。  win10和 win7下scanf表现有什么不同了 我明白您的意思，所谓扔掉了是表述问题，我太不专业，我的意思是同样的程序，同样的语言版本，那么排除程序问题，在win10下fmt.Scanf，(go语言怎么实现的我不清楚，应该和C大致相同，但这不是重点)，问题是win7下和C语言的效果完全相同，win10下第一个fmt.Scanf接收回车前面输入的，第二个接收\n，所以想来想去是不是win10和win7下的回车或者说换行符不太一样，还是说在cmd中输入不太一样

user: user-1
content: 键盘输入什么内容，是键盘驱动程序返回给系统的，系统通过标准的接口来获取输入的内容 scanf你可以看看函数的说明，键盘只有敲入回车的时候，scanf才开始启动接收并处理数据 比如，你scanf指定输入1个整数， 你输入了 1  3   5  7 然后一个回车 scanf做了什么呢， 他把第一个整数提取走了， 后面的字符都给扔了吗？ 并没有， 它是留给下一次的输入使用了 后面你有scanf的代码，还是可以继续从后面获取3，5，7等数据的 所以你的解释扔掉\n是错误的理解  键盘输入的内容是放到一个缓冲区里面的， 叫做键盘缓冲， 它并不是遇到了\n字符，后面就没有数据或者清理了前面的数据 scanf从键盘缓冲提取这些输入的字符，然后来根据指定的格式来提取数据，默认遇到空格，tab和回车都是（除非是%c的格式读取）当做数据的分隔符来处理的，或忽略这些字符找下一个匹配的数据的。 如果你只取一个整数，那么取完数字遇到了分隔符（空格 tab和回车）会如何？ scanf什么都不干，返回了，把分隔符依然留在键盘缓冲区了。 等待下一次scanf发生的时候，它遇到了这些分隔符，它会跳过去找下一个非分隔符的数据的。这就是你感觉第二个数据获取的时候前面的回车被放弃的原因。  getchar是键盘缓冲区里面是什么都直接提取一个返回， 不存在分隔符的说法， 所以能直接获得 要理解scanf的机制就好了  你说的win10和win7的区别，没有看明白你的意思 。  win10和 win7下scanf表现有什么不同了

user: user-0
content: 引用 1 楼 寻开心的回复:不用纠结，windows键盘输入就没有\r产生，就是\n  在文本文件里面才牵涉到这个\r\n的说法，有的这个叫做dos文本格式（linux系统下文本都是\n换行的） 我之前查了下确实这样，但想半天就是想不通win10和win7怎么就不一样了，既然都只有\n，那最多就是这个函数设计的不太好，也不至于两边不一样吧

user: user-1
content: 不用纠结，windows键盘输入就没有\r产生，就是\n  在文本文件里面才牵涉到这个\r\n的说法，有的这个叫做dos文本格式（linux系统下文本都是\n换行的）