首页 > 其他分享 >关于一些OJ上的\r以及\n以及字符串行输入的一些警示

关于一些OJ上的\r以及\n以及字符串行输入的一些警示

时间:2023-04-07 12:11:29浏览次数:47  
标签:OJ Windows 警示 输入 Linux 字符串 gets 回车

\r,\n,\r\n的区别 - 小 天 - 博客园 (cnblogs.com) 这篇文章详细的解释了在Windows系统和Linux系统下的换行的区别 概括的说,就是Windows系统下的“\r\n”等于Linux系统下的’\n‘ 因此在一些搭建在Linux终端上的Oj,我们输入时的回车是在WIndows系统中的输入,OJ在评判输出的时候会在Linux下输出 这就导致我们的回车行为会在Linux下表示为两个字符’\r\n‘ 借用洛谷在线IDE来表示一下

这里我们仅输入了回车,但是却从缓冲区中读到了两个字符,与第六行中的\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上呢,就不一样了

可以看到,我仅输入了一个回车(Enter键),但是gets却读到了两个字符,根据上述gets读取字符的规律以及Ascii码的对照,可以知道一个回车被解读为了'\r\n'这两个字符,其中‘\n’被认为是结束标志并被销毁替换为0

由此可以看出gets并非是以特定字符为结束标志的(scanf也是),而是以该系统下的一个Enter键(没错就是你电脑键盘上那个回车键)为结束输入的标志,当我们在Window系统下的回车('\r\n')被输入Linux上的IDE时,gets会以‘\n’作为结束符而非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;
}

 

标签:OJ,Windows,警示,输入,Linux,字符串,gets,回车
From: https://www.cnblogs.com/WKWKSL/p/17295749.html

相关文章

  • LightOJ - 1300 Odd Personality(边双连通+奇圈判定)
    题目大意:给出一张无向图,要求找出符合条件的点条件如下:从该点出发,经过一定数量的边,又回到该点,经过的边不能重复经过,且经过的边的数量为奇数解题思路:要回到原点,且不能重复经过边,只能在边双连通分量中找了接着要判断的是有多少个点,只要边双连通分量中有奇圈,那么这个连通分量中的所......
  • LightOJ - 1400 Employment(婚姻稳定问题)
    题目大意:在一个party上,有N个男的,N个女的,要求你将其配对,使其满足1.男生u和女生v还没配对2.他们喜欢对方的程度都大于喜欢各自当前舞伴的程度如果出现了2的情况,他们就会抛下当前的舞伴,另外组成一对解题思路:这题的话,就是婚姻稳定问题,他的解决方法是,男士不断的求婚,而女士不断的拒......
  • LightOJ - 1063 Ant Hills(割点)
    题目大意:求无向图中,有多少个割点解题思路:模版题了#include<cstdio>#include<cstring>#include<vector>#include<stack>usingnamespacestd;#definemax(a,b)((a)>(b)?(a):(b))#definemin(a,b)((a)<(b)?(a):(b))constintMAXNODE=10005;constintM......
  • LightOJ - 1041 Road Construction(最小生成树)
    题目大意:给你N条边,看能否形成最小生成树,如果存在,输出值,不存在,另外输出解题思路:模版题#include<cstdio>#include<cstring>#include<algorithm>#include<vector>#include<map>#include<string>#include<iostream>usingnamespacestd;constintMAXNOD......
  • POJ - 2029 Get Many Persimmon Trees(暴力水题)
    题目大意:给你一个矩阵,矩阵上面有N个柿子树,现在要求你画一个s*t的矩阵,使得这个矩阵内的柿子树达到最多解题思路:100*100,直接暴力#include<cstdio>#include<cstring>#include<algorithm>usingnamespacestd;constintN=110;intn,w,h,s,t;intmap[N][N];voidin......
  • ZOJ - 3469 Food Delivery(区间DP)
    题目大意:有一个餐厅,在X这个位置,送餐速度为v的-1次方,有N个顾客,分别在pos位置,每个顾客都有一个displeasure值,当餐送到该顾客手上时,该顾客的displeasure总值为displeasure值*到手时间问所有顾客的最小displeasure总值和是多少解题思路:首先按位置排个序设dp[i][j][0]为[i,j]这个区......
  • ZOJ - 2421 Recaman's Sequence(打表水题)
    题目大意:A0=0Am=A(m-1)-m,如果Am小于0或者Am前面已经出现过了,那么Am=A(m-1)+m解题思路:打表水题我用的是map,纪录数是否出现过了#include<cstdio>#include<cstring>#include<map>usingnamespacestd;constintN=500010;typedeflonglongLL;map<LL,int>Ma......
  • POJ - 1651 Multiplication Puzzle(区间dp)
    题目大意:给你N个数,每次可以选择一个数进行剔除(第一个和最后一个不能选择),选出该数后,sum+=该数左边的数*该数*该数右边的数问最小的sum是多少解题思路:用dp[i][j]表示[i,j]区间被剔除得只剩下i,j的最小sumdp[i][j]=dp[i][k]+dp[k][j]+num[i]*num[k]*num[j]#include......
  • POJ - 2955 Brackets(区间dp)
    题目大意:给出一个括号字符串,问这个字符串中符合规则的最长子串的长度解题思路:区间dp,用dp[i][j]表示[i,j]这个区间内有符合规则的最长子串的长度如果str[i]和str[j]能构成()或者[],那么dp[i][j]=dp[i+1][j-1]+2剩下的情况就是dp[i][j]=max(dp[i][j],dp[i][k]+dp[k......
  • POJ - 3666 Making the Grade(DP)
    题目大意:给你一个数组A,要求将这个数组变成数组B,使得Sum(abs(A[i]-B[i]))达到最小,且B是单调的解题思路:因为答案要求输出单调非递增或者单调非递减的的任意一个,那就只考虑单调非递增吧,因为两个的思路是相同的如果要变化的话,且变化的值要达到最小的话,那么只能变成和前一个相同或者......