scanf那些事

我们在网站上进行编程练习时,往往本地使用windows VC或者VS编写代码,而网站的测试服务器经常使用Linux,经常会发生这样的问题:本地使用scanf写的输入是正确的,但是提交到服务器上却发生莫名的错误。

  1. 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’。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值