3.7 转义序列示例 – 第3章 数据和C – C Prime Plus(第6版)

再来看一个程序示例,该程序使用了一些特殊的转义序列。程序清单 3.10 演示了退格(\b)、水平制表符(\t)和回车(\n)的工作方式。这些概念在计算机使用电传打字机作为输出设备时就有了,但是它们不一定能与现代的图形接口兼容。例如,程序清单3.10在某些Macintosh的实现中就无法正常运行。

程序清单3.10 escape.c程序

/* escape.c -- 使用转移序列 */
#include <stdio.h>
int main(void)
{
    float salary;
    printf("\aEnter your desired monthly salary:"); /* 1 */
    printf(" $_______\b\b\b\b\b\b\b"); /* 2 */
    scanf("%f", &salary);
    printf("\n\t$%.2f a month is $%.2f a year.", salary,
    salary * 12.0); /* 3 */
    printf("\rGee!\n"); /* 4 */
    return 0;
}

3.7.1 程序运行情况

假设在系统中运行的转义序列行为与本章描述的行为一致(实际行为可能不同。例如,XCode 4.6把\a、\b和\r显示为颠倒的问号),下面我们来分析这个程序。

第1条printf()语句(注释中标为1)发出一声警报(因为使用了\a),然后打印下面的内容:

Enter your desired monthly salary:

因为printf()中的字符串末尾没有\n,所以光标停留在冒号后面。

第2条printf()语句在光标处接着打印,屏幕上显示的内容是:

Enter your desired monthly salary: $_______

冒号和美元符号之间有一个空格,这是因为第2条printf()语句中的字符串以一个空格开始。7个退格字符使得光标左移7个位置,即把光标移至7个下划线字符的前面,紧跟在美元符号后面。通常,退格不会擦除退回所经过的字符,但有些实现是擦除的,这和本例不同。

假设键入的数据是4000.00(并按下Enter键),屏幕显示的内容应该是:

Enter your desired monthly salary: $4000.00

键入的字符替换了下划线字符。按下Enter键后,光标移至下一行的起始处。

第3条printf()语句中的字符串以\n\t开始。换行字符使光标移至下一行起始处。水平制表符使光标移至该行的下一个制表点,一般是第9列(但不一定)。然后打印字符串中的其他内容。执行完该语句后,此时屏幕显示的内容应该是:

Enter your desired monthly salary: $4000.00

$4000.00 a month is $48000.00 a year.

因为这条printf()语句中没有使用换行字符,所以光标停留在最后的点号后面。

第4条printf()语句以\r开始。这使得光标回到当前行的起始处。然后打印Gee!,接着\n使光标移至下一行的起始处。屏幕最后显示的内容应该是:

Enter your desired monthly salary: $4000.00
Gee! $4000.00 a month is $48000.00 a year.

3.7.2 刷新输出

printf()何时把输出发送到屏幕上?最初,printf()语句把输出发送到一个叫作缓冲区(buffer)的中间存储区域,然后缓冲区中的内容再不断被发送到屏幕上。C 标准明确规定了何时把缓冲区中的内容发送到屏幕:当缓冲区满、遇到换行字符或需要输入的时候(从缓冲区把数据发送到屏幕或文件被称为刷新缓冲区)。例如,前两个 printf()语句既没有填满缓冲区,也没有换行符,但是下一条 scanf()语句要求用户输入,这迫使printf()的输出被发送到屏幕上。

旧式编译器遇到scanf()也不会强行刷新缓冲区,程序会停在那里不显示任何提示内容,等待用户输入数据。在这种情况下,可以使用换行字符刷新缓冲区。代码应改为:

printf("Enter your desired monthly salary:\n");

scanf("%f", &salary);

无论接下来的输入是否能刷新缓冲区,代码都会正常运行。这将导致光标移至下一行起始处,用户无法在提示内容同一行输入数据。还有一种刷新缓冲区的方法是使用fflush()函数,详见第13章。


本人于2023年2月26日22:16:31学习完以上内容,特与此记录并分享。

© 版权声明
THE END
喜欢就点赞支持一下吧,如果觉得不错或日后有所需要,可以收藏文章和关注作者哦。
点赞4打赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容