C语言程序设计教程
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.4 标准输入/输出函数

输入是从输入设备(如键盘)向计算机输入数据的过程;输出是把程序的计算结果输出到输出设备(如显示器)的过程。C语言没有提供专门的输入/输出语句,是利用C标准函数库中提供的输入/输出函数实现的,C语言输入/输出函数库见附录D。

C标准函数库中专门的输入/输出函数很多,这些函数有格式输入/输出函数scanf()和printf(),字符输入/输出函数getchar()和putchar(),字符串输入/输出函数gets()和puts()等。这些函数的声明构成一个名为stdio.h的输入/输出函数库,用户程序要使用输入和输出函数时,要在程序文件的开始位置添加如下的宏定义,把stdio库包含到用户程序:

      #include<stdio.h>
  

然后在用户程序中直接调用所需要的输入/输出函数即可。

1.4.1 格式化输出函数printf()

(1)printf函数的调用格式

stdio库提供的格式化输出函数printf()的主要功能是向显示器(标准输出设备)输出指定的若干个格式化的数据,适用于任意的数据类型。输出值正常,返回输出字节数;输出值出错,返回EOF(-1)。函数的一般调用格式为:

printf(格式控制字符串,输出列表);

例如:

说明:

①格式控制字符串是用双引号引起来的字符串,它包含如下三种信息:

·格式说明符:由“%”和格式字符组成,如%d、%f等。它总是由“%”开始,其作用是将输出的数据转换为指定的格式输出。

·普通字符:即要原样输出的字符,一般为提示信息。如“printf("a=%d,b=%f\n",a,b);”中的“a= ,b= ”即为提示信息,是为了便于用户更好地使用程序而加入的。

·转义字符:输出一些操作行为,如换行符等。

②“输出列表”是需要输出的一些数据项,可以是变量或表达式列表,其项数一般与控制参数中的格式转换控制符个数相同,格式如下:

如变量a的值为128,则上述语句的输出结果为:a=128。

(2)常用的格式控制字符

在printf()函数中常用的格式字符如表1-4所示。

表1-4 printf()函数中的格式字符

在printf()函数中除了这些常用的格式字符外,还可以在这些格式符前加以下几种特定的附加修饰符,用于修饰输出特定格式或数据类型,如表1-5所示。

表1-5 printf()函数中的附加格式修饰字符

(3)格式控制字符用法举例

下面我们来看它们的具体用法。

①d格式符:用来输出十进制带符号整数,有以下几种用法:

%d:按十进制整型数据的实际长度输出。

%md或%-md:m为指定的输出字段宽度为1个正整数。若实际数据的位数小于m,则左端补空格;若大于m,则按实际位数输出。当m前有“-”号时,表示按m指定宽度左对齐,右端补空格。

%ld:输出长整型数据,%mld输出指定宽度的长整型数据。

②c格式符:用于输出1个字符。

对于整数,只要它的值在0~255范围内,也可以用字符形式输出。

1个字符数据也可以转换成相应的整型数据(ASCII值)输出。

③s格式符:用于输出1个字符串。有以下几种用法:

%s:最常用格式,直接输出串的内容。

%ms或%-ms:输出的字符串占m列,如字符串本身长度大于m,则突破m的限制输出字符串的全部内容;若串长小于m,则输出的字符串左补空格。%-ms意义同上,但当串长小于m时,则输出的字符串右补空格。

%m.ns或%-m.ns:输出占m列,但只取串中左端的n个字符。这n个字符输出在m列的右侧,左补空格。%-m.ns中的m、n含义同上,但右补空格。而如果n>m时,m取n的值,即保证要求的n个字符输出。

【例1-7】读程序,理解printf函数指定格式输出的用法。

      / *源程序1-7.C* /
      #include  <stdio.h>
      void main()
      {
      int i=100,j=1;                            / * 定义基本整型变量 * /
      long int a=123456;                        / * 定义长整型变量 * /
      float f1,f2;
      f1=(float)2738.54;f2=(float)-3.012;
      char cl='A',c2='a';
      printf("%-12x\t%o\t%5d\n",i,i,j);
      printf("%+12.3f\t\t%-6.0f\n",f1,f2);
      printf("%3c\t%c\n",cl,c2);
      printf("c=%ld\tc=%12ld\n",a,a);             / * 输出十进制长整数 * /
      printf("%3s,%7.3s,%.4s,%-5.2s\n","Super","Super","Super","Super");
      }
  

本程序的运行结果为:

      64              144      1
      +2738.540       -3
      Aa
      c=123456        c=123456
      Super,          Sup,Supe,Su
  

④o格式符:以八进制整数形式输出。

⑤x格式符:以十六进制整数形式输出。

⑥u格式符:用于输出unsigned(无符号)型数据,以十进制整数形式输出。

1.4.2 格式化输入函数scanf()

stdio库提供的scanf()函数可以用来从键盘(标准输入设备)输入任何类型的多个数据。输入正常,返回读取的代码值;输入出错,返回EOF(-1)。

(1)scanf函数的调用格式

scanf()函数的一般调用形式为:

      scanf(格式控制字符串,地址列表);
  

“格式控制字符串”的含义同printf()函数。

“地址列表”是由若干个地址组成的列表,用于接收输入的数据。可以是变量的地址,或字符串的首地址等。

变量地址是由地址运算符“&”后接变量名组成的,例如,&a和&b分别表示了变量a和变量b的地址。&是一个取地址运算符,&a是一个表达式,其功能是求变量的地址。变量的地址是C编译系统分配的,用户不必关心具体的地址是多少。

(2)格式控制字符

scanf()函数与printf()函数中的格式字符基本相同,用法也基本相同,其差异见下面的说明。表1-6列出了scanf()函数中用到的格式字符,表1-7列出可以使用的附加修饰符。

表1-6 scanf()函数中的格式字符

表1-7 scanf()函数中的附加格式说明字符

对于unsigned类型的数据,在输入时既可以用%u,也可以用%d,甚至%x、%o均可。输入时可以指定数据所占的列数(域宽),系统将按它自动截取需要的数据。说明如下:

①scanf("a=%d b=%d ",&a1,&b1);

输入时的格式:a=10 b=20↙     / * 普通字符,要原样输入 * /

说明:系统取10给变量a,20给变量b。用"%d%d%d"格式输入时,不能用逗号(可用空格)作两个输入数据间的分隔符。

②scanf("%3d%2d",&a,&b);

输入:123456 ↙

输出:a=123,b=45

系统自动将123赋给a,45赋给b。也可用于字符型。

③scanf("%2d%*2d%d",&a,&b);

输入:123456↙

输出:a=12,b=56

说明:使用了“*”格式修饰符,则表示跳过它所指定的列数。则系统截取2位整数12赋给变量a,而跳过中间的两位34,取最后的两位56给变量b。

④输入数据时不能规定数据的精度,如以下的输入语句:

      scanf("%7.2f",&a);
  

是不合法的。这样做变量a根本无法得到正确的输入。

1.4.3 字符输入输出函数

(1)字符输入函数getchar()

getchar()函数的功能是接收从终端(键盘或系统指定的输入设备)输入的1个字符,它没有参数,但从输入设备中接收的字符通过函数返回值的形式得到。其基本格式为:

      ch=getchar();
  

其中ch为字符型的变量(或整型变量)。程序执行完此语句后,ch中即存入了用户从键盘上键入的字符。

(2)字符输出函数putchar()

putchar()函数的作用是向终端输出一个字符。其基本格式为:

      putchar(c);
  

其用途是输出字符型参数c的值。参数c通常为字符型变量或字符常量,也可以是整型变量或整型常量(对大于255的整数,则只取低位字节中的数据)。

【例1-8】从键盘输入大写字母,用小写字母输出。

      / *源程序1-8.C* /
      #include <stdio.h>
      void main()
      {
        char c1,c2;
        c1=getchar();              / * 调用getchar()函数从键盘接收一个字符,并将之赋给变量c1* /
        printf("%c,%d\n",c1,c1);   / * 调用printf()函数格式输出c1* /
        c2=c1+32;
        putchar(c2);               / * 输出字符变量c2中的数据,即字符'a'* /
        printf("%d\n",c2);
        putchar('\n');             / * 输出换行符 * /
      }
  

程序的运行结果为:

      输入:A ¿
      输出:A,65
            a,97