关于一些OJ上的\r以及\n以及字符串行输入的一些警示
这里我们仅由一个换行输入,但是却从缓冲区中读到了两个字符,与第六行中的\r\n的Ascii码值比较可以看出,Windows系统下的回车确实会被搭建在Linux下的洛谷OJ判定为两个符号即回车符(\r)和换行符’\n‘的组合。
由于这个特性,当我们做题时想清空缓冲区时,必须考虑缓冲区中的\r\n而不是仅考虑\n
插入,经过试验,大多数的OJ(蓝桥OJ,PTA,洛谷OJ)都会将单一的\r也作为换行的标志如下


但是在Windows的IDE却不会这样,我也不到为啥。汗
在我查的资料里\r不论在Windows还是在Linux系统下都只是将光标回到当前行首
以后做题注意下
/——————————————————————————————————————————————————————————————
接下来在讲一讲字符串的行输入问题
由于scanf遇到空格或回车就会停止输入(同时空格和回车不会包含在内),因此在碰到带有空格的字符串的输入会有点麻烦,这时候我们想到了gets函数
gets函数会一直读出缓冲区的内容直到遇到换行符,注意,gets会读入换行符而不像scanf不读入,同时当读入结束后,gets会将换行符销毁并替换为’\0‘
因此,在使用完gets后并不用向scanf一样担心缓冲区回车符的残留
结合上述转义字符以及gets的讲解,在OJ上我们可以发现一些神奇的事
如图,Windows下的直接输入一个回车,可以看出gets确实读到了这个回车键,而且将其销毁替换成0
而在洛谷的在线IDE上呢,就不一样了
可以看到,我输入了一个换行符,但是gets却读到了两个字符,根据上述gets读取字符的规律以及Ascii码的对照,可以知道一个回车被解读为了'\r\n'这两个字符,其中‘\n’被认为是结束标志并被销毁替换为0
由此可以看出gets是以换行符‘\n’为结束标志的,而且他会将回车符从缓冲区读入后销毁并替换为0,由于在windows下生成的测试文本的换行为‘\r\n’,因此每次gets一下,得到的字符串里就会多出一个‘\r’,表现在OJ里的输出就是会莫名其妙的换行或者读取错误
因此最好还是别用gets了(心累ing),可以用scanf看看有没有别的处理方法,或者用gets的话可以参考一下这段代码
bool Safe_Gets(char *S)
{
if (!gets(S))return false;//若已经到文件或者缓冲区结尾,gets会返回char*型的NULL指针
int n = strlen(S);
if (n && S[n - 1] == '\r')S[n-1]=0;//当字符长度不为0同时又以回车符结尾时,将回车符替换为结束标志‘\0'
return true;
}
这样的话就可以避免\r的入侵,不过使用第一个gets时别忘了清空缓冲区
——————————————————————————————————————————————————————
OJ上的输入回车是根据行来判定的

比如这个输入,1到2需要回车,那么可以知道第一行输入完会有一个'\r\n',第2,3,4行同理,但是第五行最后并未换行,因此没有‘\r\n’的残留,可以认为在最后是通过Enter键入的,也就是纯粹的换行符‘\n',而非‘\r\n’,而且这在Windows以及Linux下都是相同的,也就是说,Enter键仅代表换行符'\n'的输入,无论是在Windows还是Linux中。
关于一些OJ上的\r以及\n以及字符串行输入的一些警示的更多相关文章
- 如何在cluster上跑R脚本
R 是一个比较不错但是有时候操蛋的语言,不错是因为用着爽的时候真的很爽,操蛋是因为这种爽不是什么时候都可以的,比如说在cluster上批处理跑R脚本. 当然说这话有些在上面跑过的各种不服气,你丫傻逼吧 ...
- 关于OJ上内存问题的试验
char类型占一个字节 int类型占4个字节 如果杭电OJ上给的范围是32678K,那么内存大小就是32678*1024=33554432 那么可以开到多大的数组呢?!可以开到很大,但是可用的就只有3 ...
- Ubuntu 12.04上安装R语言
Ubuntu 12.04上安装R语言 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ R的安装 sudo gedit /etc/apt/sources. ...
- python的正则表达式 re-------可以在字符串前加上 r 这个前缀来避免部分疑惑,因为 r 开头的python字符串是 raw 字符串,所以里面的所有字符都不会被转义
正则表达式使用反斜杆(\)来转义特殊字符,使其可以匹配字符本身,而不是指定其他特殊的含义.这可能会和python字面意义上的字符串转义相冲突,这也许有些令人费解.比如,要匹配一个反斜杆本身,你也许要用 ...
- R语言中的字符串处理函数
内容概览 尽管R是一门以数值向量和矩阵为核心的统计语言,但字符串有时候也会在数据分析中占到相当大的份量. R语言是一个擅长处理数据的语言,但是也不可避免的需要处理一些字符串(文本数据).如何高 ...
- R语言︱文本(字符串)处理与正则表达式
处理文本是每一种计算机语言都应该具备的功能,但不是每一种语言都侧重于处理文本.R语言是统计的语言,处理文本不是它的强项,perl语言这方面的功能比R不知要强多少倍.幸运的是R语言的可扩展能力很强,DN ...
- windows上,任务管理器中,进程命令行太长怎么办
一.前言 在windows上,有时候需要查看进程命令行,但是有的进程的命令行太长了,很难看全 此时,可以使用下面的方法解决(红框改为自己要查看的进程即可): C:\Users\Gaoyu>wmi ...
- R语言如何将字符串转变为命令执行
这里用到 eval() 和 parse() 函数.首先使用 parse() 函数将字符串转化为表达式(expression),而后使用 eval() 函数对表达式求解.x <- 1:10a &l ...
- 九度OJ 1121:首字母大写 (字符串处理)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2865 解决:1007 题目描述: 对一个字符串中的所有单词,如果单词的首字母不是大写字母,则把单词的首字母变成大写字母. 在字符串中,单词 ...
- linux tail-在屏幕上显示指定文件的末尾若干行
博主推荐:获取更多 linux文件内容查看命令 收藏:linux命令大全 tail命令用于输入文件中的尾部内容.tail命令默认在屏幕上显示指定文件的末尾10行.如果给定的文件不止一个,则在显示的每个 ...
随机推荐
- 与奥运同行:打造智慧体育馆 3D 可视化
祝贺中国队在东京奥运会夺得金牌 38 枚.银牌 32 枚.铜牌 18 枚.中国健儿在奥运舞台上交出了一份璀璨的成绩单.用一场场精彩绝伦的比赛,演绎"更快.更高.更强.更团结"的奥林 ...
- 三、java连接mongo数据库
系列导航 一.linux单机版mongo安装(带密码验证) 二.mongo集群搭建 三.java连接mongo数据库 四.java对mongo数据库增删改查操作 五.mongo备份篇 mongoexp ...
- spring-transaction源码分析(5)TransactionInterceptor事务拦截逻辑
spring-tx的事务拦截逻辑在TransactionInterceptor类,本文将详细分析其实现方式. 事务拦截器TransactionInterceptor spring-tx的事务拦截逻辑在 ...
- Shell-全局变量-export
- Linux-搜索-文件-find-locate-内容过滤-grep
- [转帖]聊聊redis的slowlog与latency monitor
https://www.jianshu.com/p/95a9ce63ddb2 序 本文主要研究一下redis的slowlog与latency monitor slowlog redis在2.2.12版 ...
- [转帖]kubernetes(k8s):容器资源限制(内存限制、cpu限制、namespace限制)
文章目录 1. k8s容器资源限制 2. 内存资源限制实例 3. cpu资源限制 4. namespace设置资源限制 5. namespace中pod的配额 6. namespace的创建.使用和删 ...
- [转帖]性能优化:Swap调优
目标:解决大量Log写入占用大量的File Cache,内容利用不充分导致swap 基本原则:尽量使用内存,减少swap,同时,尽早flush到外存,早点释放内存给写cache使用.---特别在持续的 ...
- [转帖] jq命令用法总结
https://www.cnblogs.com/codelogs/p/16324928.html 原创:扣钉日记(微信公众号ID:codelogs),欢迎分享,转载请保留出处. 简介# 如果说要给Li ...
- [转帖]/proc文件简介
https://www.jianshu.com/p/2610241770be 简介 /proc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间.它以文件系统的方式为访问系统内核数据的操作提 ...