在C语言中究竟是什么\ r \ n?

时间:2012-03-10 01:17:48

标签: c

#include <stdio.h>

int 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 =%d ",countwd);

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

  getch();
}

这是我遇到\r的程序。它在这里的作用究竟是什么?我是C的初学者,我很欣赏这方面的明确解释。

7 个答案:

答案 0 :(得分:13)

'\r'是回车符。有用的主要时间是:

  1. 以二进制模式读取文本,或者可能来自国外操作系统时,由于Windows格式文本文件中的CR / LF行结尾,您会发现(并且可能想要丢弃)文本。 / p>

  2. 当写入stdoutstderr上的交互式终端时,可以使用'\r'将光标移回行的开头,用新的覆盖它内容。这是一个很好的原始进度指示器。

  3. 您帖子中的示例代码肯定是使用'\r'错误的方式。它假定回车符将在输入行末尾的换行符之前,这是不可移植的,仅在Windows上为true。相反,代码应该查找'\n'(换行符),并丢弃它在换行符之前找到的任何回车符。或者,它可以使用文本模式并让C库处理翻译(但文本模式很难看,可能不应该使用)。

答案 1 :(得分:11)

这是Carriage Return。资料来源:http://msdn.microsoft.com/en-us/library/6aw8xdf2(v=vs.80).aspx

以下内容会重复循环,直到用户按下返回键。

while(ch!='\r')
{
  ch=getche();
}

答案 2 :(得分:9)

曾几何时,人们有类似打字机的终端(只有大写字母,但这是另一个故事)。搜索“Teletype”,您认为tty如何用于“终端设备”?

这些设备有两个不同的动作。回车将打印头移回到行的开头而不滚动纸张;换行符将纸张向上移动一行而不将打印头移回到行首。因此,在这些设备上,您需要两个控制字符才能使打印头返回到下一行的开头:回车符和换行符。因为这是机械的,所以需要时间,因此在发送CR和LF字符后,在向终端发送更多字符之前,必须暂停足够长的时间。没有LF的CR的一个用途是通过重击线上的字符来“加粗”。您将该行写出一次,然后使用CR重新开始并在需要加粗的字符上打印两次。当然,你也可以输入你希望部分隐藏的东西,或者制作非常密集的ASCII艺术图片并明智地进行重击。

在Unix上,这些东西的所有逻辑都隐藏在终端驱动程序中。您可以使用stty命令和基础函数(当时,ioctl()调用;它们在1988年被POSIX.1清理到termios接口中)以调整各种方式终端的表现。

最终,你得到了'玻璃终端',速度更快,而且还有新的特性需要处理 - 黑塞尔汀故障等等。这些内容已经包含在termcap和更晚的terminfo库中,然后进一步封装在curses库后面。

然而,其他一些(非Unix)系统也没有隐藏东西,你必须在文本文件中处理CRLF - 不,这不仅仅是'CRLF'阵营中的Windows和DOS

无论如何,在某些系统上,C库必须处理包含CRLF行结尾的文本文件,并向您呈现这些文件,就好像在行尾只有换行符一样。但是,如果您选择将文本文件视为二进制文件,您将看到CR字符以及LF。

旧Mac OS(版本9或更早版本)等系统仅使用CR(又名\r)作为行尾。像DOS和Windows这样的系统(我相信很多DEC系统,如VMS和RSTS)都使用CRLF作为行结束。许多互联网标准(如邮件)要求CRLF行结束。并且Unix总是使用LF(也就是NL或换行符,因此\n)来表示其行结尾。大多数人在大多数情况下设法忽略CR。

您的代码在寻找\r时非常时髦。在符合C标准的系统上,除非文件以二进制模式打开,否则您将看不到CR; CRLF或CR将由C运行时库映射到NL。

答案 3 :(得分:2)

有几个字符可以表示新行。通常的是这两个: '\ n'或'0x0A'(十进制10) - &gt;此字符称为“换行”(LF)。 '\ r'或'0x0D'(十进制13) - &gt;这个被称为“回车”(CR)。

不同的操作系统以不同的方式处理换行符。以下是最常见的简短列表:

DOS和Windows

他们希望换行符是两个字符的组合,即'\ r \ n'(或13后跟10)。

Unix(因此也是Linux)

Unix使用单个'\ n'来表示新行。

<强>苹果

Mac使用单个'\ r'。

答案 4 :(得分:1)

这并非总是如此;它只适用于Windows 对于与putty,Linux shell中的终端交互,它将用于将光标返回到行的开头。 下图显示了其用法:

没有&#39; \ r&#39;

  

数据没有&#39; \ r&#39;对于腻子终端,它只是&#39; \ n&#39;   这意味着数据将在下一行打印。

enter image description here

使用&#39; \ r&#39;

  

数据附带&#39; \ r&#39 ;,字符串以&#39; \ r \ n&#39;结尾。因此,putty终端中的光标不仅会进入下一行,还会进入行

的开头

enter image description here

答案 5 :(得分:1)

&#39; \ r&#39;表示回车

\ r \ n意味着没有什么特别之处。对于字符模式终端(通常模拟上面甚至更旧的打印),在原始模式下,\ r和\ n的行为类似(除了光标,因为没有托架或滚轮。历史上,\ n用于向下移动托架,而\ r用于将托架移回屏幕的左侧。

答案 6 :(得分:0)

这取决于您在哪个平台上进行翻译以及它是否会在那里进行翻译:Wikipedia entry on newline