#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语言的初学者,对此我很欣赏一个清晰的解释。
发布于 2012-03-10 09:19:49
我是Carriage Return。来源:http://msdn.microsoft.com/en-us/library/6aw8xdf2(v=vs.80).aspx
下面重复该循环,直到用户按下Return键。
while(ch!='\r')
{
ch=getche();
}发布于 2012-03-10 09:20:57
'\r'是回车符。它的主要用途是:
stdout或stderr上写入交互式终端时,可以使用'\r'将光标移回到行首,以便用新内容覆盖它。这是一个很好的原始进度指示器。你的文章中的示例代码绝对是一个错误的使用'\r'的方式。它假定回车将在输入的行尾的换行符之前,这是不可移植的,并且仅在Windows上为真。相反,代码应该查找'\n' (换行符),并丢弃在换行符之前找到的任何回车。或者,它可以使用文本模式,并让C库处理翻译(但文本模式很难看,可能不应该使用)。
发布于 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。
https://stackoverflow.com/questions/9643077
复制相似问题