首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C语言中\r到底是什么?

在C语言中\r到底是什么?
EN

Stack Overflow用户
提问于 2012-03-10 09:17:48
回答 7查看 116K关注 0票数 14
代码语言:javascript
复制
#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语言的初学者,对此我很欣赏一个清晰的解释。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-03-10 09:19:49

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

下面重复该循环,直到用户按下Return键。

代码语言:javascript
复制
while(ch!='\r')
{
  ch=getche();
}
票数 13
EN

Stack Overflow用户

发布于 2012-03-10 09:20:57

'\r'是回车符。它的主要用途是:

  1. 当以二进制模式读取文本时,或者可能来自外部操作系统,您会发现(并且可能想要丢弃)它,因为它来自Windows格式的文本文件中的CR/LF行结尾。
  2. 当在stdoutstderr上写入交互式终端时,可以使用'\r'将光标移回到行首,以便用新内容覆盖它。这是一个很好的原始进度指示器。

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

票数 14
EN

Stack Overflow用户

发布于 2012-03-10 09:37:15

曾几何时,人们有像打字机一样的终端(只有大写字母,但那是另一回事了)。搜索“电传”,你认为tty是如何被用来做“终端设备”的?

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

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

最终,你得到了“玻璃终端”,那里的速度更快,而且有新的特性需要处理-- Hazeltine故障等等。这些都包含在termcap和后来的terminfo库中,然后进一步封装在curses库后面。

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

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

像旧的Mac (版本9或更早的版本)这样的系统只使用CR (也就是\r)作为行尾。像DOS和Windows这样的系统(我相信,还有许多DEC系统,比如VMS和RSTS)都使用CRLF作为行尾。许多Internet标准(如邮件)要求使用CRLF行结尾。Unix一直只使用LF (也称为NL或换行符,因此使用\n)作为行尾。大多数人,在大多数情况下,设法忽略了CR。

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

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9643077

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档