搜索
热搜: NOIP OIer 神牛
查看: 351|回复: 1

换行和回车区别

[复制链接]

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2022-1-22 11:16:02 | 显示全部楼层 |阅读模式
换行:newline 向下移动一行,并不移动左右
回车:return 到当前行的最左边行

例如:
abcd
d后面换行则会到d的正下方
d后面回车则会移动到a的前面

linux/unix换行:\n(0x0A) newline 表示回车+换行
MAC回车:\r(0x0D) return  表示回车+换行
Windows回车换行:\r\n(0x0D,0x0A) 表示回车+换行
Enter = 回车+换行(\r\n)  注:\r\n连用时,不能调换顺序
历史:
回车”(Carriage Return)和“换行”(Line Feed)这两个概念的来历和区别。
在计算机还没有出现之 前,有一种叫做电传打字机(Teletype Model 33,Linux/Unix下的tty概念也来自于此)的玩意,每秒钟可以打10个字符。但是它有一个问题,就是打完一行换行的时候,要用去0.2秒,正 好可以打两个字符。要是在这0.2秒里面,又有新的字符传过来,那么这个字符将丢失。
于是,研制人员想了个办法解决这个问题,就是在每行后面加两个表示结束的字符。一个叫做“回车(return)”,告诉打字机把打印头定位在左边界;另一个叫做“换行(newline)”,告诉打字机把纸向下移一行。这就是“换行”和“回车”的来历,从它们的英语名字上也可以看出一二。
问题:
如下代码AC
#include <bits/stdc++.h>
using namespace std;
char c1[1001],c2[1001];
int len1,len2,dp[1001][1001];
int main(){
       cin>>c1>>c2;
       len1=strlen(c1);
       len2=strlen(c2);
       for(int i=0;i<len1;i++) dp[0]=0;      
       for(int i=0;i<len2;i++) dp[0]=0;
       for(int i=1;i<=len1;i++){
              for(int j=1;j<=len2;j++){
                     if(c1[i-1]==c2[j-1]){
                            dp[j]=dp[i-1][j-1]+1;
                     }else{
                            dp[j]=max(dp[i-1][j],dp[j-1]);
                     }
              }
       }      
       cout<<dp[len1][len2];
}



回复

使用道具 举报

主题

帖子

0

积分

新手上路

Rank: 1

积分
0
 楼主| 发表于 2022-1-22 11:16:25 | 显示全部楼层

如下代码只有20分

#include <bits/stdc++.h>

using namespace std;

char c1[1001],c2[1001];

int len1,len2,dp[1001][1001];

int main(){

    gets(c1);

    gets(c2);

    len1=strlen(c1);

    len2=strlen(c2);

    for(int i=0;i<len1;i++) dp[i][0]=0;   

    for(int i=0;i<len2;i++) dp[0][i]=0;

    for(int i=1;i<=len1;i++){

        for(int j=1;j<=len2;j++){

            if(c1[i-1]==c2[j-1]){

                dp[i][j]=dp[i-1][j-1]+1;

            }else{

                dp[i][j]=max(dp[i-1][j],dp[i][j-1]);

            }

        }

    }   

    cout<<dp[len1][len2];

}

输入两个连续字符串,为什么不能连续使用gets

【问题定位】
拿一个测试点分析,发现计算结果比标准答案多1,很可能是输入数据问题
【问题分析】
观察测试点输入.in文件
ABCDEFGHIJKLM
NOPQRSTUVWXYZ
对应十六进制(ultraedit软件查看):

输入文件显然是在windows下生成,换行为\r\n

oj系统为linux,linux换行为\n,所以gets()会获取\n之前的字符(包括了回车\r)
所以求LCS长度比实际数字大1。

【解决问题】
修改测试点中的.in文件,把\r去除(linux系统换行符)
cin>>c1>>c2
为什么linux下cin可以过滤掉\r的影响,且看如下分析。

在理解cin功能时,不得不提标准输入缓冲区。windows系统下当我们从键盘输入字符串的时候需要敲一下回车键才能够将这个字符串送入到缓冲区中,那么敲入的这个回车键(\r\n)中\r会被转换为换行符\n,\n也会被存储在cin的缓冲区中并且被当成一个字符来计算!比如我们在键盘上敲下了123456这个字符串,然后敲一下回车键(\r\n)将这个字符串送入了缓冲区中,那么此时缓冲区中的字节个数是8 ,而不是6。

cin读取数据也是从缓冲区中获取数据,缓冲区为空时,cin的成员函数会阻塞等待数据的到来,一旦缓冲区中有数据,就触发cin的成员函数去读取数据。

使用cin从标准输入读取数据时,通常用到的方法有cin>>,cin.get,getline。

cin可以连续从键盘读取想要的数据,以空格、tab或换行作为分隔符。

   
注意:
(1)cin>>等价于cin.operator>>(),即调用成员函数operator>>()进行读取数据。
(2)当cin>>从缓冲区中读取数据时,若缓冲区中第一个字符是空格、tab或换行这些分隔符时,cin>>会将其忽略并清除,继续读取下一个字符,若缓冲区为空,则继续等待。但是如果读取成功,字符后面的分隔符是残留在缓冲区的,cin>>不做处理。


cin>>对缓冲区中的第一个换行符视而不见,采取的措施是忽略清除,继续阻塞等待缓冲区有效数据的到来。但是,getline()读取数据时,并非像cin>>那样忽略第一个换行符,getline()发现cin的缓冲区中有一个残留的换行符,不阻塞请求键盘输入,直接读取。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

津ICP备19006949号-1 | 津公网安备12010102000465号

快速回复 返回顶部 返回列表