标准输入和输出函数 所谓输入输出是以计算机为主体而言的。在C语言中,所有的数据输入/输出都是由库函数完成的, 因此都是函数语句。在使用C语言库函数时,要用预编译命令#include将有关"头文件"包括到源文件中。 scanf函数和printf函数也是C语言标准的输入输出函数,因为在程序编写过程中,用户可以通过scanf函数和printf函数对输入的数据与输出的数据进行格式化规范(例如指定存放或者显示数据的类型、位置、长度等),因此二者又被称之为格式输入函数和格式输出函数。功能较getchar函数和putchar函数要强大很多,是编写C语言程序的时最常用的两个函数。下面将详细介绍scanf函数和printf函数的使用及常用格式说明。 
1:格式说明符 格式控制说明符:由%与普通字符组成,例如%d,%c等。 

例如:int a; char b; float c; scanf(“%d,%c,%f”,&a,&b,&c); 要求在整型变量a中存放“123”,字符型变量b中存放字符“a”,单精度浮点型变量c中存放“1.23”。则正确的输入方法为:123,a,1.23↙(注意:三个数据中间的逗号不能省略。) 说明: 用scanf函数读入数据,地址列表有三个,中间用逗号相隔开,变量的前面必须用“&”符号表示取变量的地址。 格式控制%d与&a相对应进行输出格式控制,%c与&b对应进行输出格式控制,%f与&c对应进行输出格式控制。格式控制部分除了格式控制,中间由两个逗号相隔开,因此输入数据的时候数据之间必须输入逗号。 当程序运行到scanf函数的时候,屏幕呈黑屏状态(同getchar函数,详见图3.1),光标闪烁等待用户输入相关数据。 格式说明符之间没有普通字符相互分隔——输入数据的时候,中间需要用空格、tab或者回车将数据分隔。
2 下面介绍printf函数的几种常见使用: printf函数有输出表项的情况
如:int a=1;char b=’x’;float c=1.234;printf(“a=%d,b=%c,c=%f\n”,a,b,c); 结果:a=1,b=x,c=1.234000↙ 说明:
本例初始化了三个不同类型的变量,通过printf函数将三个变量的内容输出。 printf函数中的格式控制部分,由普通字符与格式说明符及转义字符组成,普通字符“a=”、“,b=”、“,c=”均原样输出;转义字符‘\n’表示输出完内容要回车换行;格式控制%d与a相对进行输出格式控制,%c与b相对应进行输出格式控制,%f与c相对应进行输出格式控制,按照从左向右的顺序,依次将三个变量中存放的值输出到标准输出设备上。 %f是按照单精度浮点数输出,C语言规定,%f格式化的数据,在标准输出设备上无论其原来有几位小数,默认按照6位小数输出。(实际上浮点型数据输出的小数宽度是可以指定位数的) printf函数没有输出表项的情况 例如:printf(“ What’s your name?\n”); 结果:What’s your name?↙ 说明: 3 scanf函数和printf函数的特殊格式控制前面介绍了scanf函数与printf函数的基本应用,然而在实际操作中,对于数据的输入与输出用户经常会提出更高的要求,例如制定输出数据的宽度、对齐方式、小数位数等等。这些操作需要将表3.2中的参数与表3.3中的参数结合起来使用。本节将着重介绍scanf函数和printf函数的特殊格式控制。 数据输入及输出的宽度——既可以应用于scanf函数又可以应用于printf函数 对scanf函数按格式宽度输入数据:格式控制可以对整型格式的数据进行宽度控制,格式为%md。m表示接收输入数据的宽度(见3-3表)。
例如:int a,b,c; scanf(“%4d%2d%3d”,&a,&b,&c); 不同输入方式: 输入数据正好是格式说明需要的长度:123456789↙,则系统自动将1234赋给a,56赋给b,789赋给c。 输入数据超出格式说明需要的长度:1234567890↙,则系统自动将1234赋给a,56赋给b,789赋给c,剩下0没有接收。 输入数据少于格式说明需要的长度: 12345678↙,则系统自动将1234赋给a,56赋给b,78赋给c。 12345↙,当敲完回车之后,光标在第二行第一列闪烁,等待继续输入数据。出现此现象的原因是,根据格式说明要求的长度,系统自动1234赋给a,5赋给b,而没有数据赋值给c变量,因此会出现如下情况。
说明: 本例的含义是定义了三个整型变量,输入三个数据分别存放在三个变量中。 scanf函数的三个格式说明符“%4d%2d%3d”,中间没有任何分隔,并且对于输入数据的宽度有了一定限制,因此输入的数据中间可以没有任何分隔,系统会根据说明符的宽度自动截取相应的数据。 输入的数据不同时会有不同的结果。同学们可以思考一下,如果在输入的时候误输入一个浮点数或者一个字符类型的数据,会有什么样的结果? 对printf函数按格式宽度输出数据:格式控制可以对不同类型的数据进行宽度的限定。如%m(d、f、lf、c、s),其中m代表输出数据规定的宽度(见3.3表)。如果规定的宽度大于数据原有的宽度,则用空格填充其他列;如果规定的宽度小于数据原有的宽度,数据按原样输出。
例如:int a=123,b=1234567; float c=1.234; printf("a=%5d,b=%5d,c=%10f\n",a,b,c); 结果: 
说明: a输出的格式是%5d,表示输出的数据要占5列,a存放的数据是123,只有三列,所以系统在数据左侧自动填充2个空格。 b输出的格式是%5d,表示输出的数据要占5列,b存放的数据是1234567,超出了格式规定的宽度,此时系统自动将数据原样输出,而不是从中间截断。 c输出的格式是%10f,表示输出的数据要占10列,c存放的数据加上小数点共占5列,当浮点数在屏幕上显示的时候,小数位数默认要显示6列,所以需要在小数位补3个零,因此一共为8列,因此系统在数据左侧自动填充了2个空格。 数据输出对齐方式——只可以用于printf函数,不可以用于scanf函数
要求:数据输出默认是左对齐,当格式控制中出现负号的时候,表示数据按照右对齐显示。 例如:int? a,b; a=b=123;printf("a=%5d,b=%-5d \n",a,b); 结果: 
说明: a输出的格式是%5d,表示输出的数据要占5列,没有负号表示输出的数据按右对齐,所以123右对齐输出后,在其前面(左侧)补充2个空格。 b输出的格式是%-5d,表示输出的数据要占5列,负号表示输出的数据按左对齐,所以123左对齐输出后,在其后面(右侧)补充2个空格。 指定小数位数——只可以用于printf函数,不可以用于scanf函数
要求:可以对浮点型数据指定小数位数,如%.n(f、lf、e)。其中n代表需要保留小数的位数,注意要进行四舍五入。指定小数位数可以与限定数据宽度、数据对齐方式同时使用(此方法同样应用于字符串格式化操作,既%m.ns,由于篇幅有限不做详细介绍)。 例如:float a=123.4567890; printf("a=%f,a=%9.3f,a=%3.5f,a=%.2f\n",a,a,a,a); 结果: 
说明:本例中a共按照四种形式进行输出 %f原样输出,由于系统默认单精度(float)或者双精度(double)的数据,原样显示在屏幕上的时候,小数要有6位,因此输出的结果整数位不变,小数位6位。但是float类型数据只能提供7位有效数据,因此结果中123.4567都是有效数据,后面的87均为无效数字。 %9.3f格式输出,9.3表示输出的数据宽度为9,小数点后保留3位,并且进行四舍五入,列数不够用空格填充。 %3.5f格式输出,3.5表示输出的数据宽度为3,小数点后保留5位,并且进行四舍五入,由于需要显示的数据宽度超过规定的3,因此小数点保留5位后数据原样输出。 %.2f格式输出,.2表示没有限定数据的宽度,只限定了小数点后保留2位,并且进行四舍五入,整数部分正常输出。 其他常用特殊格式——如果想输出一个%字符,则应该在格式控制部分连续用两个%表示。
例如:printf(”%%”); 输出结果:% |