第十一章 控制台输入/输出
成功取决于执行力
Dennis Ritchie想使C语言保持紧凑,处于这个想法,他特意从C语言中排除了与输入/输出(I/O)相关的一切。因此,C语言没有提供从输入设备(如键盘、硬盘等)接收数据,或者向输出设备(如显示器、硬盘等)发送数据的功能。因此,该怎么管理I/O呢?如果C语言没有提供I/O,那所使用的printf()和scanf()又是怎样工作的呢?这就是本章要探讨的问题。
11.1 首先了解一点,I/O设备会随着操作系统的不同而不同。因此,一个操作系统在屏幕上显示输出的方式可能与另一个操作系统不同。例如,对基于DOS的C编译器来说,标准库函数printf()已经写好了DOS下将字符输出到屏幕的方式。同样的,对基于UNIX的C编译器,printf()已经写好了UNIX下将字符输出到屏幕的方式。作为程序员,不必关心printf()函数是怎么写的,只要会用printf()就行了,其他的细节取决于操作系统。对于所有其它用于I/O的标准库函数也是一样的。
11.2 为I/O提供的库函数有很多,大致可以分为两个大类:
●控制台输入/输出函数:从键盘输入、从显示器输出的函数。
●文件输入/输出函数:在软盘货硬盘上进行输入/输出操作的函数。
11.3 什么是控制台?简单的说就是屏幕和键盘。
控制台输入/输出函数可以进一步分为两大类:格式化的控制台函数和非格式化的控制台函数。它们之间的根本区别是----格式化的函数可以按照我们要求的格式从键盘读取数据或将数据在显示器上输出。
格式化的输入/输出函数有:printf()、scanf()
非格式化的输入/输出函数有:getch()、putch()、getche()、putchar()、getchar()、gets()、puts()
11.4 %10.1f和%-10.1f代表什么意思呢?
答曰:10表示字段的宽度、0.1表示精度、+表示右对齐、-表示左对齐。
11.5 转义字符
\n 换行符
\t 制表符
\b 退格
\r 回车
\a 警告
\’单引号
\”双引号
11.6 sprintf()和sscanf()函数
sprintf()函数的功能和printf()函数的功能相类似,该函数是将内容输出到一个字符数组,而不是像printf()那样输出到屏幕上。sscanf()与之相对应。例:
#include <stdio.h>
int main(void)
{
int i=10;
char ch ='A';
float a=3.14;
char str[20];
printf("\n%d %c %f",i,ch,a);
sprintf(str,"%d %c %f",i,ch,a);
printf("\n%s",str);
system("pause");
}
11.7 非格式化的控制台输入/输出函数
到目前为止,我们一直用scanf()函数来输入。但是有些情况下,scanf()函数有明显的弱点,就是你需要按回车键,函数才能接受所输入的值。而我们常希望函数可以在按下某个键的时候就读入该单个字符,不需要等到按下回车键后。
下面我们来详细了解一下这些可爱的函数。
●getch()函数
接受输入的字符后返回,并不将该字符显示在屏幕上。
●getche()函数
接受输入的字符后返回,并将该字符显示在屏幕上。
●getchar()函数
接受输入的字符按回车键后返回,并将该字符显示在屏幕上,宏
●fgetchar()函数
接受输入的字符按回车键后返回,并将该字符显示在屏幕上,函数
值得注意的一点是:getch()和getche()的函数原型存储在头文件conio.h中,
宏getchar()和fgetchar()函数的原型存储在stdio.h中。
示例:
#include <stdio.h>
#include <conio.h>
int main(void)
{
char ch;
printf("\nPress any key to continue");
getch();
printf("\nType any character");
ch=getche();
printf("\n%c",ch);
printf("\nType any character");
getchar();
printf("\nContinue Y/N");
fgetchar();
system("pause");
}
11.8 与getch()、getchar()、对应的是putch()、putchar(),它们将字符输出在屏幕上。 例如:
#include <stdio.h>
#include <conio.h>
int main(void)
{
char ch='A';
putch(ch);
putchar(ch);
fputchar(ch);
putch('Z');
putchar('Z');
fputchar('Z');
system("pause");
}
提示:还有处理字符串的函数,gets()和puts(),详情参考前述。