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

GEE*_*max 13 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();
}
Run Code Online (Sandbox Code Playgroud)

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

R..*_*R.. 14

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

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

  2. 当写入交互式终端时,stdout或者stderr,'\r'可用于将光标移回行的开头,用新内容覆盖它.这是一个很好的原始进度指标.

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

  • 测试(ch!='\ r')是*无偿*非便携式......如果你正在使用MFC,你会得到MFC提供的东西......但在这种情况下,你可以测试'\n',它将保证在所有平台上运行. (3认同)
  • 对于C语言的新手来说,这段代码显然是*学习材料*.而C语言的新手应该学习正确使用C语言,而不是非便携式黑客.肯定有时间和地点使用特定于一个平台的库或假设,但这是在特定于在该平台上构建的小型隔离模块,而不是通用代码.C语言的新学习者应该从一开始就做到这一点,否则他们的代码质量会受到很大影响. (3认同)

Luc*_*ore 11

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

以下重复循环,直到用户按下Return键.

while(ch!='\r')
{
  ch=getche();
}
Run Code Online (Sandbox Code Playgroud)


Jon*_*ler 9

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

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

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

最终,你得到了"玻璃终端",速度更快,而且还有新的特性需要处理 - 黑塞汀故障等等.这些被载入termcap后来的terminfo库中,然后进一步封装在curses库后面.

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

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

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

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