关于一些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行.如果给定的文件不止一个,则在显示的每个 ...
随机推荐
- 微信小程序图片展示类型
- CSS3 ------- object-fit属性
做项目经常会遇到图片列表展示,图片一般是用户从后台上传的,上传的图片尺寸千差万别.如果前端不控制图片大小,整个排版就会很乱,如果给定长宽,图片又会变形,用背景图片来处理有特别麻烦.这个问题一直苦恼了我 ...
- watch监听对象遇坑
当以下数据,有一个变化,就重新调接口. formInline: { needTrain: '', trainResult: '', userNameS ...
- 简易机器学习笔记(八)关于经典的图像分类问题-常见经典神经网络LeNet
前言 图像分类是根据图像的语义信息对不同类别图像进行区分,是计算机视觉的核心,是物体检测.图像分割.物体跟踪.行为分析.人脸识别等其他高层次视觉任务的基础.图像分类在许多领域都有着广泛的应用,如:安防 ...
- 使用ProjectQ生成量子算法指令集
技术背景 所谓的指令集,按照字面意思来理解就是计算机底层允许使用的操作指令的集合.在量子计算机领域,由于实现方案的不同,在不同的体系内的指令集其实是不一样的,并不是说OpenQASM里面的所有指令都会 ...
- java - 字节流读取文件
package stream; import java.io.*; public class InputStreamReaderString { public static void main(Str ...
- win11不改时区,安装 android 子系统,运行android app
win11开启虚拟机平台 下载安卓子系统 打开https://store.rg-adguard.net , 在URL中输入:https://www.microsoft.com/store/produc ...
- 通过宿主机查看K8S或者是容器内的Java程序的简单方法
通过宿主机查看K8S或者是容器内的Java程序的简单方法 背景 最近一个项目的环境出现了 cannot create native process 的错误提示 出现这个错误提示时, docker ex ...
- 各种数据库shell一键登录的方法
各种数据库shell一键登录的方法 一个小场景 想通过shell 直接执行一些内容. 然后发现通过shell就可以. 所以这里总结一下 1. Oracle export ORACLE_HOME=/u0 ...
- [转帖]TiDB 数据库统计表的大小方法
简介:TiDB统计表的大小,列出了一些方法: 1.第一种的统计方式: 基于统计表 METRICS_SCHEMA.store_size_amplification 要预估 TiDB 中一张表的大小,你可 ...