预计阅读本页时间:-
下面是另一个打印程序,它使用了C的一些专用转义字符。程序清单3.10演示了退格(\b)、制表符(\t)和回车符(\r)的工作方式。这些概念从计算机使用电传打字机作为输出设备时就开始使用,但它们并不一定能成功地与现代图形接口兼容。比如,此程序不能在某些Macintosh实现中正确运行。
程序清单3.10 escape.c程序
广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元
3.7.1 过程分析
假设在ANSIC环境中运行此程序,下面逐步研究此程序。第一条printf()语句(标为1的语句)发出一声警告声音(由\a产生),并打印出下列内容:
Enter your desired monthly salary:
由于字符串结尾没有\n,所以光标仍然停留在冒号后边。
第2条printf()语句紧接着前面打印,则屏幕显示如下:
Enter your desired monthly salary: $_______
在冒号和美元符号之间有一个空格,因为第2条printf()语句中的字符串以空格开始。7个退格字符使光标左移7个位置,也就是把光标向左移动过那7个下划线字符,使它直接紧跟在美元符的后面。通常,退格字符不删除退回时所经过的字符,但有些实现是删除的,这会和本练习有所不同。
这时,键入回答2000.00,则屏幕显示为:
Enter your desired monthly salary: $2000.00
键入的字符代替了下划线字符。按下Enter(或Return)键以发出您的回答,光标将移到下一行的起始位置。
第3条printf()语句以\n\t开始。换行符使光标移到下一行的起始位置,制表符使光标移到该行中的下一个制表点,一般是第9列(但不一定)。然后打印字符串其余的部分。此语句执行完毕时,屏幕显示如下:
Enter your desired monthly salary: $2000.00
$2000.00 a month is $24000.00 a year.
由于printf()语句没有使用换行符,所以光标停留在句号后面。
第4条printf()语句以\r开始,使光标移至当前行起始位置,然后显示Gee!,接着\n使光标移到下一行的起始位置。屏幕上最后结果为:
Enter your desired monthly salary: $2000.00
Gee! $2000.00 a month is $24000.00 a year.
3.7.2 刷新输出
printf()函数什么时候真正把输出传送给屏幕?首先,printf()语句将输出传递给一个被称为缓冲区(buffer)的中介存储区域。缓冲区中的内容再不断地被传递给屏幕。标准C规定在以下几种情况下将缓冲区内容传给屏幕:缓冲区满的时候、遇到换行符的时候以及需要输入的时候。将缓冲区内容传送给屏幕或文件称为刷新缓冲区(flushing the buffer)。例如,上例中,前两个printf()语句既没有填满缓冲区也不包含换行符,但是后面紧跟了一个scanf()语句要求输入。迫使printf()的输出内容被传给屏幕。
您可能会遇到早期的C语言版本,这样的版本中遇到scanf()语句不强迫缓冲区刷新,这将使程序停在那里等待您的输入,而没有显示任何提示信息。为防止此问题,可以用换行符刷新缓冲区,如下所示:
printf (“Enter your desired monthly salary: \n”) ;
scanf (“%f”, &salary) ;
不管后续的输入语句是否引起刷新缓冲区,该代码都会正常工作。但是,这样做使光标移到下一行起始位置,防止您在提示字符串的同一行输入数据。另一个解决办法是使用fflush()函数,详见第13章“文件输入/输出”。