#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的初学者,我很欣赏这方面的明确解释。
答案 0 :(得分:13)
'\r'
是回车符。有用的主要时间是:
以二进制模式读取文本,或者可能来自国外操作系统时,由于Windows格式文本文件中的CR / LF行结尾,您会发现(并且可能想要丢弃)文本。 / p>
当写入stdout
或stderr
上的交互式终端时,可以使用'\r'
将光标移回行的开头,用新的覆盖它内容。这是一个很好的原始进度指示器。
您帖子中的示例代码肯定是使用'\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; 这意味着数据将在下一行打印。
使用&#39; \ r&#39;
数据附带&#39; \ r&#39 ;,字符串以&#39; \ r \ n&#39;结尾。因此,putty终端中的光标不仅会进入下一行,还会进入行
的开头
答案 5 :(得分:1)
&#39; \ r&#39;表示回车。
\ r \ n意味着没有什么特别之处。对于字符模式终端(通常模拟上面甚至更旧的打印),在原始模式下,\ r和\ n的行为类似(除了光标,因为没有托架或滚轮。历史上,\ n用于向下移动托架,而\ r用于将托架移回屏幕的左侧。
答案 6 :(得分:0)
这取决于您在哪个平台上进行翻译以及它是否会在那里进行翻译:Wikipedia entry on newline