我们在网站上进行编程练习时,往往本地使用windows VC或者VS编写代码,而网站的测试服务器经常使用Linux,经常会发生这样的问题:本地使用scanf写的输入是正确的,但是提交到服务器上却发生莫名的错误。
- Windows“换行”与linux“换行”
我们知道windows中的“换行”由两个字符’\r’以及’\n’组成;linux的换行由是一个字符’\n’。
例如:我们从编程测试网站上下载的输入文件
其实,每行的末尾字符是’\r\n’
为什么我们用VC或者VS用scanf写的输入是正确的,提交到服务器上是错误的?
我们知道一般scanf其实是从stdin流的缓冲区中读入数据,参考示意图:
以上面的输入rel_input.txt为例
我们首先看看windows下,scanf读入时,stdin缓冲区的情况:
其中,stdin 的缓冲区buffer的起始地址0x006D3500,buffer的大小是4096,当前的指针是0x006D3504,也就说当前指向“换行”(’@’代表’\n’),我们发现’\r’并没有读入到stdin buffer中。
我们来看看linux下,scanf读入时,stdin缓冲区的情况:
其中,stdin 的缓冲区buffer的起始地址0x7f536dd8c00,buffer的大小是4096,我们发现’\r’’\n’都读入到stdin buffer中,其中’$’代表’\r’,‘@’代表’\n’。