简述回车、换行(\r,\n,\r\n)的区别

在Windows中:

  1. ‘\r’ (回车):将光标回到当前行的行首(而不会换到下一行),之后的输出会把之前的输出覆盖。
  2. ‘\n’ (换行):将光标换到当前位置的下一位置,而不会回到行首。

Unix系统里,每行结尾只有“<换行>”,即"\n";Windows系统里,每行结尾是“<回车><换行>”,即“\r\n”;Mac系统里,每行结尾是“<回车>”,即"\r"。即:

  1. Linux中遇到换行符(“\n”)会进行回车+换行的操作,回车符(“\r”)反而只会作为控制字符(“^M”)显示,不发生回车的操作。
  2. Windows中要回车符+换行符(“\r\n”)才会有回车+换行的效果,缺少一个控制符或者顺序不对都不能正确的另起一行。

常见的一种情况就是:

  1. Unix/Mac系统下的文件在Windows里打开的话,所有文字会变成一行;
  2. Windows里的文件在Unix/Mac下打开的话,在每行的结尾可能会多出一个^M符号。

例如:在linux中执行下面命令:

$ echo -en '12\n34\r56\n\r78\r\n9' > tmp.txt

然后,在linux中使用vim打开的效果如下所示:

12
34^M56
^M78^M
9

把该文件下载到windows中,并使用记事本打开,效果如下所示:

12345678
9

可以发现在windows中只有“/r/n”才能正确触发“我们理解的换行”操作。

应用: 在解析字符串,或其他格式的文件内容的时候,我们经常需要判定“回车换行”的地方,这个时候就要注意:既要判定"\r\n"又要判定"\n"。

在汇编语言中,由于其低级特性,操作通常是直接对内存和硬件指令进行操作,下面是一个基本的示例,展示了如何用x86汇编语言实现你所提到的功能。这个例子假设我们使用的是Intel x86架构。 首先,我们需要声明一些局部变量来存储字符,并设置堆栈指针。这里只给出部分关键代码: ```assembly section .data ; 字符数组 letters db 'abcdefghijklmnopqrstuvwxyz', 0 cr_lf db 13, 10 ; 回车换行码 section .bss ; 字符串缓冲区 input_buffer resb 256 section .text global _start _start: ; 设置堆栈指针 mov esp, ebp ; 子程序:处理26个字母 handle_letters: ; 使用循环遍历并显示每个字母 mov ecx, 26 mov edi, letters loop_letters: lodsb ; 读取字节到AL寄存器 ; 显示当前字母... ; (此处省略实际显示字符的汇编指令) jmp $+1 ; 继续下一次循环 loop loop_letters ; 子程序:回车换行 enter_new_line: ; 指令序列实现CR/LF mov al, cr_lf[0] ; 获取回车 out 0x7, al ; 输出到设备0(通常为控制台) mov al, cr_lf[1] ; 获取换行 out 0x7, al ; 输出到设备0 ret ; 返回 ; 子程序:接收并显示字符串 get_and_display_string: ; 从用户输入获取数据 ; (这里使用简单的键盘读取,实际应用可能涉及中断等复杂机制) ; 接收字符串至input_buffer ; ... ; 将字符串内容显示出来 mov esi, input_buffer ; 指向输入缓冲区 display_loop: lodsb ; 读取下一个字节 ; 显示当前字符... ; (此处省略实际显示字符的汇编指令) cmp byte [esi], 0 ; 判断是否结束 jne display_loop ; 若非空则继续 ret ; 返回主程序 ; 主程序调用子程序 main: call handle_letters call enter_new_line call get_and_display_string ; 结束程序 mov eax, 1 ; 系统调用编号(exit) xor ebx, ebx ; 返回值0 int 0x80 ; 发送系统调用 ``` 请注意,这只是一个非常基础的例子,实际的汇编代码会涉及到更复杂的指令集和操作系统交互。此外,现代计算机通常使用高级语言(如C/C++),然后通过编译链接生成汇编代码。在实际开发中,很少直接使用汇编语言编写这种底层任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

王小二(海阔天空)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值