\n(换行符)和\r(回车符)有什么区别?

特别地,\n和\r之间有什么实际的区别吗?是否有应该使用其中一种而不是另一种的地方?


当前回答

\n(换行符)和\r(回车符)有什么区别? 特别地,\n和\r之间有什么实际的区别吗?是否有应该使用其中一种而不是另一种的地方?


我想用各自的转义序列\n(换行符)和\r(回车符)做一个简短的实验,以说明它们之间的明显区别。

我知道,这个问题是独立于语言的。尽管如此,我们至少需要一种语言来完成这个实验。在我的例子中,我选择了c++,但这个实验通常适用于任何编程语言。

该程序只是通过for循环迭代将一个句子打印到控制台。


换行符计划:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \n";   // Notice `\n` at the end.
    }
    return 0;
}

输出:

1.Walkthrough of the for-loop
2.Walkthrough of the for-loop
3.Walkthrough of the for-loop
4.Walkthrough of the for-loop
5.Walkthrough of the for-loop
6.Walkthrough of the for-loop
7.Walkthrough of the for-loop

注意,此结果不会在任何系统上提供,您正在执行此c++代码。但它适用于最现代的系统。阅读下文了解更多细节。


现在,同样的程序,但不同的是,在打印序列的末尾,\n被\r取代。

车厢返回程序:

#include <iostream>

int main(void)
{
    for(int i = 0; i < 7; i++)
    {
       std::cout << i + 1  <<".Walkthrough of the for-loop \r";   // Notice `\r` at the end.
    }
    return 0;
}

输出:

7.Walkthrough of the for-loop 

注意到区别在哪了吗?不同之处在于,当您在每个打印序列的末尾使用回车返回转义序列\r时,此序列的下一次迭代不会进入下面的文本行-在每个打印序列的末尾,光标不会跳转到下一行的*开头。

相反,在使用\r字符之前,光标跳回到该行的开头,他一直在该行的末尾。-结果是,打印序列的每个后续迭代都将取代前一个。

*注:A \n不一定跳转到下一行文本的开头。在一些较老的操作系统上,\n换行符的结果可能是,它跳转到下一行的任何位置,而不仅仅跳转到开头。这就是为什么,他们需要使用\r \n来获得在下一个文本行的开始。


这个实验向我们展示了在打印序列的迭代输出中换行符和回车符的区别。

在讨论程序中的输入时,一些终端/控制台可能会隐式地将回车符转换为换行符,以获得更好的可移植性、兼容性和完整性。

但是,如果您可以选择为另一个选择,或者希望或需要显式地只使用特定的一个,那么您应该始终使用符合其目的并严格区分的那个操作。

其他回答

在ascii码方面,它是3——因为它们分别是10和13;-)。

但说真的,有很多:

in Unix and all Unix-like systems, \n is the code for end-of-line, \r means nothing special as a consequence, in C and most languages that somehow copy it (even remotely), \n is the standard escape sequence for end of line (translated to/from OS-specific sequences as needed) in old Mac systems (pre-OS X), \r was the code for end-of-line instead in Windows (and many old OSs), the code for end of line is 2 characters, \r\n, in this order as a (surprising;-) consequence (harking back to OSs much older than Windows), \r\n is the standard line-termination for text formats on the Internet for electromechanical teletype-like "terminals", \r commands the carriage to go back leftwards until it hits the leftmost stop (a slow operation), \n commands the roller to roll up one line (a much faster operation) -- that's the reason you always have \r before \n, so that the roller can move while the carriage is still going leftwards!-) Wikipedia has a more detailed explanation. for character-mode terminals (typically emulating even-older printing ones as above), in raw mode, \r and \n act similarly (except both in terms of the cursor, as there is no carriage or roller;-)

In practice, in the modern context of writing to a text file, you should always use \n (the underlying runtime will translate that if you're on a weird OS, e.g., Windows;-). The only reason to use \r is if you're writing to a character terminal (or more likely a "console window" emulating it) and want the next line you write to overwrite the last one you just wrote (sometimes used for goofy "ascii animation" effects of e.g. progress bars) -- this is getting pretty obsolete in a world of GUIs, though;-).

不同操作系统的两个不同字符。这在通过TCP/IP传输的数据中也起着作用,这需要使用\r\n。

\ n Unix

\ r Mac

Windows和DOS。

\r:回车̲return cr -返回行首回车 \n:换行(n̲ew Line) lf -纸上一行

在屏幕输出的上下文中:

CR:将光标返回到当前行的开头 “LF”:光标下移一行

例如:

你好,\n世界\r!

应该在您的终端上呈现为:

Hello,
!     world

一些操作系统可能会破坏预期行为的兼容性,但这不会改变“\n和\r之间的差异?”这个问题的答案。

因为没有人特别提到它(他们是不是太小了,不知道/不记得?)-我怀疑\r\n的使用起源于打字机和类似的设备。

当你在使用多行打字机时,想要打出新的一行,它必须执行两个物理操作:将滑架滑回页面的开头(在美国是左),并将纸张上一个缺口。

在行式打印机的时代,打印粗体文本的唯一方法,例如,是做一个没有换行符的回车,并在旧的字符上打印相同的字符,从而添加更多的墨水,从而使它看起来更暗(粗体)。当打字机的机械式“换行”功能失效时,令人讨厌的结果是:如果你不注意,你可能会把上一行文本敲过。

#include <stdio.h>

void main()
{
  int countch=0;
  int countwd=1;

  printf("Enter your sentence in lowercase: ");
  char ch='a';
  while(ch!='\r')
  {
    ch=getche();
    if(ch==' ')
      countwd++;
    else
      countch++;
  }

  printf("\n Words = ",countwd);

  printf("Characters = ",countch-1);

  getch();

}

让我们以这个例子为例,试着把\n放在\r的地方,它不会工作,并试着猜测为什么?