C语言输入输出.docx_第1页
C语言输入输出.docx_第2页
C语言输入输出.docx_第3页
C语言输入输出.docx_第4页
C语言输入输出.docx_第5页
免费预览已结束,剩余9页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C语言输入输出C语言输入输出输入字符getchar()getchar函数是对单个字符进行输入的函数。它的功能是:从标准输入设备上(键盘)输入一个且只能是一个字符,并将该字符返回为getchar函数的值。格式: getchar()例如:char ch;ch = getchar(); ch为字符型变量,上述语句接收从键盘输入的一个字符并将它赋给ch。 例1:getchar函数应用。 #include main()int i;i=getchar();printf(%c:%dn,i,i); 执行本程序时,按下字符A并回车后,显示结果如下:A:65在使用getchar函数时,要注意以下几点: 1)getchar函数是不带参数的库函数,但是()不能省略。2)用户输出一个字符后,只当按“回车”键之后输入的字符才有效; 3)getchar函数只接受一个字符,而非一串字符。上例中:若输入abcde,getchar函数也只接受第一个字符a。 4)getchar函数得到的字符可以赋给一个字符变量或整型变量,也可以不赋给任何变量而是作为表达式的一部分。 5)getchar函数不能够显示输入的数据,如果希望显示该数据,必须调用相应的输出函数(例如putchar()库函数)来实现。 还有一个与之相接近的函数是getch()函数。getch()函数表示当用户在键盘上输入一个字符后,该字符立即被计算机接受,可以通过输出函数显示出来,而无需等待“回车”命令。输出字符putchar()putchar函数是对单个字符进行输出的函数。它的功能:将指定表达式的值所对应的字符输出到标准设备(终端),每次只能输出一个字符。 格式:putchar(输出项) putchar()必须带输出项,输出项可以是字符型常量或变量,putchar函数功能与printf函数中的%c相当。例2:putchar函数的应用#includestdio.hmain()char o=O,k=K; putchar(o); putchar(k); putchar(n);putchar(*)执行结果为: OK*使用putchar函数时,应注意以下几点: 1)输出的数据只能是单个字符,不能是字符串。abc或“abc”都是错误的。 2)被输出的字符常量必须用单引号括起来,如:n、*。不能用双引号,导致错误。 3)当输出项是表达式的时候,可以写成a+32等形式,不能写成an等形式。 另外,与putchar函数的功能和使用方法一样,putch函数也可以输出一个字符。scanf函数的调用格式scanf函数原型包含在标准输入输出头文件“stdio.h”中。调用格式: 格式:scanf(格式控制字符串,输入项地址列表); scanf函数有两项参数,用“”引起来的格式控制字符串和需要接收数据的内存地址。格式控制字符串:规定数据输入的格式,由转换说明符和普通字符组成,转换说明符和百分号(%)一起使用,用来说明输入数据的数据类型(格式字符)。输入项地址列表:需要接收数据的变量地址,这些输入项与格式控制字符串在类型和数量上要对应,当有多个输入项时,各个地址名之间以逗号“,”分隔。输入格式和变量类型要保持一致。在C语言中,一个变量的地址可以通过地址运算符&得到。例如:定义int a,b;则a,b的地址为&a,&b。(见指针一章)scanf()函数中的输入项是变量地址,输入数据将被放入变量地址所指示的内存单元中,所以在变量前要加地址运算符“&”。提示忘记变量前加地址操作符“&”是初学时容易犯的一个错误。现阶段只要记住scanf语句中的每个变量名前面都要有&,例外的情况在以后讨论。摘自高克宁 雒兴刚主编高级语言程序设计scanf函数的格式说明格式说明字符串规定了输入项中的变量将以何种类型的数据格式(由转换说明符给出)被输入,格式控制字符串的一般形式: % 修饰符 转换说明符 其中修饰符为任选项。 1)格式转换说明符:用于指定相应输入项内容的输入格式,常用格式见下表1。表1 scanf函数转换说明符格式意义d输入一个十进制整数o输入一个八进制整数x输入一个十六进制整数i输入一个有符号或无符号的十进制、八进制、十六进制整数u输入一个无符号十进制整数f 、e或E、 g或G输入一个小数形式或指数形式的浮点数c输入一个字符s输入一个字符串例如:int x;scanf(“%d”,&x); 它有两个参数“%d”和&x,第一个参数是格式控制字符串,由%后接一个类型转换说明符构成,指出用户应该输入的数据类型,转换说明符%d说明输入的数据应该是一个整数。第二个参数是变量x的地址,&与变量名连用是将变量x的内存地址告诉scanf函数,计算机然后就会将输入的数据存储在这个地址单元中。 计算机在执行scanf语句时,等待用户输入变量x的值,用户通过键入一个整数并按下回车键响应请求,计算机把用户的输入值赋给变量x,操作完成后,对x的引用就会使用这个值。scanf函数(及后面学习的printf函数)提高了用户与计算机之间的交互性。 在有多个输入项时,如果格式控制字符串中没有普通字符或转义字符作为读入数据之间的分隔符,则一般采用空格符、符或回车键作为读入数据的分隔符,当C语言的编译系统空格符、符或回车键以及非法字符时,会自动认为数据输入结束。计算机等待所有的数据输入结束后的最后一次,将读入的数据分别付给对应的变量所指定的内存单元。如果数据的输入少于格式控制字符串中指定的转换说明符的个数,则计算机将一直等待数据的输入,直到所有数据全部被键入为止。 例如:int x,y; scanf(“%d%d”,&x,&y); 读入数据的方式可以是:12或者12或者 1 2采用“%d%d”形式的格式字时,不能使用其它的数据读入方式。例如:1,2,会使得只有1被送入x单元,而y单元不能够得到数据2。 但是,在输入多个带有字符型数据时,若以空格符作为分隔符,可能产生非预期的结果。此时,空格将被作为有效字符处理。 例如:int a; char ch; scanf(“%d%c”,&a,&ch); 如果数据读入方式为:123a,本意是期望变量a的值为数值32,变量ch的值为字符a,但实际上用于分隔数据的空格被作为有效字符数据读入并赋予给字符变量ch。为了避免这种情况,可以在格式控制字符串中加入空格作为分隔符。将上面例句改为:scanf(“%d %c”,&a,&ch);此处的%d后的空格,就可以跳过字符a前所有的空格,从而保证非空格数据的正确录入。2)修饰符 scanf函数的修饰符有:数据读入宽度(域宽)、*和长度。修饰符和意义见下表2。表2 修饰符以及意义标识符意义域宽指定输入数据的宽度*跳过相应数据不作处理l或h读入长整型、双精度型或短整型数据域宽 可以用一个十进制数指定输入数据的数据宽度,系统自动按域宽截取输入数据。 例如:int a; scanf(“%3d”,&a);表示按宽度3输入一个整数给变量a。如果读入数据为:123456,则变量a实际接收的值为123。 例如:int a,b,c; scanf(“%2d%3d%4d”,&a,&b,&c);如果读入数据为:123456789,则变量a、b 、c 的值分别是12、345和6789。可以实现数据的自动截取。 字符* *表示按指定格式读入数据但不赋予相应的变量,作用是跳过相应的读入数据。 例如:int a,b,c; scanf(“%d%*d%d”,&a,&b,&c);执行该语句,若输入为1? 2? 3,结果为a=1,b=3,c未赋值,2被跳过。 例1:一个实际问题处理一个日期数据。 假设日期读入的格式为: 12-2-2003或12/02/2003,该数据格式中的年、月、日三个数据需要保存,但是连接年、月、日数据的连接符需要被废弃。 当用户以12-02-2003形式键入日期数据时,该数据中的每一个数值(年、月、日)需要被读入对应的变量year、month、date内存单元中,为了去掉不需要的将年、月、日数据分开的连接符,直接方法是将这些字符包含在scanf的格式控制串中。 例如将语句写成:scanf(“%d%d%d,&date,&month,&year);这条语句可以去掉以12-2-2003形式读入数据中的连字符,但是当用户输入如下格式的日期数据::12/2/2003或12:2:2003时,该语句语句不仅不能去掉不需要的字符(/或:),还会造成数据错误(只能正确得到date数据)。如果在输入格式字符串中使用scanf函数提供的*,将语句写成: scanf(“%d%*c%d%*c%d,&date,&month,&year);就能够从输入数据中读取有效数据并废弃任何%*c所指定的数据(不将其赋给某个变量)。 程序清单如下: #includemain( ) int month, day,yaer;printf(Enter a date in the form d-m-y:);scanf(%d%*c%d %*c%d,&date,&month,&year);printf(date=%d month=%d year=%dn,date ,month,year);运行结果: Enter a date in the from d-m-y:12/3/2003day=12,month=3,year=2003l和h用于说明输入的数据时长整型(l)或短整型(h)。l和h可以和转换说明符d、o、x一起使用,形式为%ld、%lo、%lx、%hd、%ho、%hx,此外l还可以与f或e一起(%lf或%le)表示输入double型数据。 例如:long a;short b;scanf(“%10ld%hd”,&a,&b);表示变量a的数据按宽度为10的长整型读入,而变量b的数据按短整型读入。 3)普通字符(非格式字符) 格式控制字符串中除了格式字与修饰符外,还可以包含普通字符,这些普通字符包括:可打印字符、空格和转义字符。 可打印字符:对scanf函数,如果格式控制字符串中的说明符之间包含有其他字符,那么在输入数据时,必须在相应位置读入这些字符。 例如 :int a,b; scanf(“%d,%d”,&a,&b); 若数据输入:12;则只有变量a的数据是正确的,变量b则会发生错误。这是因为格式控制字符串中存在可打印字符“,”,所以在读入数据时,必须以“,”作为输入数据的分隔符。正确地读入数据方式应为:1,2又如:scanf(“a=%d,b=%f,c=%c”,&a,&b,&c);当输入为:1,2,a时,虽然采用了“,”分隔数据,但也会产生错误,因为在格式控制字符串中还有其他的可打印字符(如:“a=”,“b=”,“c=”等)。也就是说,这些字符作为输入数据的分隔符,在scanf函数读入数据时自动去掉。因此正确地数据读入方式应为:a=1,b=2.1,c=a空格 格式控制字符串中的空格可以分隔数据,在多个数据输入过程中,如果没有普通字符做数据的分隔符,则在数值数据输入时,可以用空格作为读入数据的分隔符,但在字符数据输入时,空格则不能作为数据之间的分隔符,它将被作为有效数据处理。 转义字符 在以%c格式的数据读入中,转义字符被作为有效字符处理。而在格式控制字符串中的转义字符具有输入转义字符所代表的控制代码或特殊字符的功能。 请分析下面程序代码: main()int a,b;scanf(%d%dn,&a,&b);printf(a=%d,b=%dn,a,b);如果输入1 2,会发生什么现象?应该怎样读入数据,才能得到执行结果?提示尽量不要在scanf()函数的格式控制字符串中出现普通字符,特别是转义字符,它会增加读入数据的难度并可能造成不可预料的错误。printf函数的调用格式printf函数是一个标准库函数,能够以精确的格式输出程序运算的结果。printf函数的调用格式为: printf(“格式控制字符串”,输出项列表); printf函数有两项参数:用“”引起来的格式控制字符串和向标准设备输出的数据。每次调用printf函数时都要包含描述输出格式的 “格式控制字符串”。 格式字符串是由格式字符(包括:转换说明符、标志、域宽、精度)和普通字符组成,转换说明符和百分号(%)一起使用,用来说明输出数据的数据类型、标志、长度和精度。 输出项列表可以是常量、变量和表达式,也可以没有输出项,这些输出项必须与格式控制字符串在类型和数量上完全对应,否则,结果将不可预测。当有多个输出项时,各个输出项之间用逗号,分隔。提示在开始使用printf函数时最常犯的错误是忘记用双引号将格式控制字符串括起来。摘自高克宁 雒兴刚主编高级语言程序设计printf函数的最简单的使用当没有输出项时,函数的参数只有“格式字符串”。函数完成的功能就是将“”中的字符串输出(显示在屏幕上)。 例1: 输出字符串hello Cprogramming! main() printf(“hello Cprogramming!”); 可以在显示器屏幕上看到输出结果为:hello Cprogramming! printf函数永远不会自动换行,如果想将hello Cprogram!分行输出,输出形式如下: helloCprogram!则需要引入转移字符n,或者多次调用printf函数分段输出。程序如下:main() printf(“hellon Cprogram!”); 或:main() printf(“hellon”); printf(“Cprogram!”); 其中:“n”是一个转移字符,是控制字符。它的作用是使计算机执行printf函数时,指示从下一行的右边开始的换新一行输出。所以显示器上出现了两行字符。如果在字符串中忘记了“n”,那么输出的结果就没有换行(尽管可以多次调用printf函数)。例如下面的程序: main() printf(“hello”); printf(“Cprogram!”); 输出结果仍为:hello Cprogram!转义字符的含义参见下表。转义字符意义n换新行起始符r回车(到本行起始)b退格符f换页符t横向制表符v纵向制表符反斜杠单引号双引号?问号0空字符(NULL)ddd1到3为八进制数所代表的字符xhh1到2位十六进制树所代表的字符转义字符只能是用小写字母,每个转移字符被看成是一个字符常量。如:0但是:用单引号括起来的一个汉字如好则不是字符常量;同样用双引号“”括起来的单个字符如“a” 也不是字符常量,它是字符串常量。因为双引号“”、单引号、反斜杠等在C语言中的特殊作用,如果要在字符串重新打印这些字符,则不能直接使用这些字符,而要使用转义字符“”、“”、“”等。 例如:输出“hello Cprogram!”,程序应改为: main() printf(“”hello Cprogram!”); 提示可以在printf()函数中适当的运用转义字符,以增加输出效果。但是要注意每个转义字符的不同含义,不要弄混。摘自高克宁 雒兴刚主编高级语言程序设计格式化输出在使用printf函数时,当系统遇到输出的转换说明符后,会自动用后面对应的输出项的值代替它的位置,然后输出。格式控制字符串中的转换字符应与输出列表中的待输出项之间应一一对应,这些转换字符控制对应的输出项以该格式输出。数据类型必须与格式符相匹配。 格式控制字符串的一般形式: % 修饰符 转换说明符 其中修饰符为可选项,包括标志修饰符、宽度修饰符、精度修饰符、长度修饰符,用于确定输出数据的宽度、精度、对齐方式等,用于产生更加规范、整齐、美观的数据输出形式,当没有修饰符时,以上各项按系统缺省值设定显示。 1)转换说明符 转换说明符规定了对应输出项的输出格式,即将输出的数据转换为指定的格式输出。该项不能省略。常用的转换说明符及其含义见表1。表1 转换说明符及其含义转换说明符意义C按字符型输出d或i按十进制整数输出u按无符号十进制整数输出f按浮点型小数输出E或e按指数形式(科学计数法)输出o按八进制整数输出(不输出前缀o)X或x按十六进制整数输出(不输出前缀ox)s按字符串输出G或g按e和f格式中输出宽度较短的一种形式输出转换说明符要与%一起使用,不能省略%。上表中的字符只有放在%的后面才作为输出的转换说明。 例如:int max; printf(“%d”,max); 表示变量max的值以十进制整数形式输出。 又如:int d=15; printf(“d=%d”,d); 在该格式控制字符串中,第1个d不是输出格式字而是一个普通字符,需要按原字符形式输出,第3个d是一个变量名,是输出项,只有放在%后的第2个d才是转换说明符, 说明变量d的值(15)以十进制整数形式输出。输出格式是:d=15。提示printf()函数中的格式字中,除格式说明符E、G、X外,其它格式说明符必须小写。例1:输出格式控制符的使用。 main( ) int a1=+400,a2=-400;float b=3.1415926,e=31415.26535898;float g=3.140000;char c=a;double d=3.1415926535898;printf(a1=%dn,a1);printf(a1=%on,a1);printf(a1=%xn,a1);printf(a1=%un,a1);printf(a2=%dn,a2);printf(a2=%un,a2);printf(b=%fn,b);printf(e=%en,e);printf(g=%gn,g);printf(d=%fn,d);printf(c=%cn,c);printf(s=%sn, Cprogram);执行程序,输出结果为:a1=400a1=620a1=190a1=400a2=-400a2=65136b=3.141593e=3.141593e+04g=3.14d=3.141593c=as=Cprogram从输出结果可以看出:只有减号(-)才会被打印出来,加号(+)是不打印的。?使用%u格式控制符打印正整数时,该数不发生变化,但是打印负整数时,该负整数将被转换为无符号整数并打印出来。?缺省情况下,使用%f、%e、%E打印出来的值带有6个小数位,如果小数位数不够6位,则在最后添0补位。?单精度数一般有7位有效数位。使用%e和%E打印的带有指数的值,在指数前打印出字母e或E,同时小数点左侧的数字仅打印一位(科学计数法)。双精度数可以用%f格式输出,它的有效位一般为16位,6位小数位。 %g不打印输出数据的小数部分尾部的0。 一个转换说明符是以%开始,以表3-2中的字符结束。其中可以插入修饰符。 2)长度修饰符 常用的长度修饰符有两种:l(长)表示按长整型量输出,h(短)表示按短整型量输出。可以和输出转换说明符d、f、u等连用。其用法和含义见表2。表2 长度修饰符的意义格式意义%ld用于长整型数据的输出%hd用于短整型数据的输出%lf用于双精度型数据的输出例2:长度修饰符的使用。 main()long int a=1234567;int b=12345;double d=1234567.123456789;printf(a=%ldn,a);printf(b=%hdn,b);printf(d=%lfn,d);执行程序,结果如下:a=1234567b=12345d=1234567.123457例3:读入数据与输出数据类型的匹配。 main( ) int a;printf(“enter a data:n”);scanf(%d,&a);printf(%dn,a);程序运行结果:enter a data:100000000-520036096由于输入数据的类型为整型,读入的数据本身已超出基本整型范围,使计算结果发生错误,同时,输出函数的输出格式字为长整型,造成输出结果与输入数据不相符。因此应将程序修改如下:main( )long int a;clrscr();printf(enter a data:n);scanf(%ld,&a);printf(%ldn,a);enter a data:10000000l10000000提示输入长整型数据时,应在数据的后面加上字母l或L。3)宽度修饰符和精度修饰符 宽度修饰符用来指定printf()函数输出数据的占位宽度,用一个十进制整数表示输出数据的位数,插在百分号%与转换说明符之间,其作用是控制打印数据的宽度,也称为“域宽”。也可以在prinf函数中指定输出数据的精度。以一个小数点开始,后紧跟着一个十进制整数表示精度,插在百分号%与转换说明符之间。对于不同数据类型,精度的含义也不相同:在使用%d时,精度表示最少要打印的数字的个数。在使用%f、%e、%E时,精度是小数点后面显示的数字个数。在使用%s时,精度表示输出的字符串中字符的个数。提示scanf不允许指定精度输入。宽度和精度也可以同时使用,其使用形式是:域宽.精度。 常用的宽度修饰符与精度修饰符说明以及含义见表3。表3 宽度修饰符与精度修饰符说明修饰符及说明格式意义%md以宽度m输出整型数,不足m位数时左侧补以空格。%0md以宽度m输出整型数,不足m位数时左侧补以0(零)。%m.nf以宽度m输出实型数,小数位数为n位。%ms以宽度m输出字符串,不足m位数时左侧补以空格。%m.ns以宽度m输出字符串左侧的n个字符,不足m位数时左侧补以空格。例3:宽度修饰符和精度修饰符的使用。 main()printf(%3dn,1);printf(%3dn,10);printf(%3dn,100);printf(%3dn,1000);printf(%0.3dn,1);printf(%0.3dn,10) ;printf(%0.3dn,100);printf(%0.3dn,1000);printf(%.3dn,1);printf(%.3dn,10);printf(%.3dn,100);printf(%.3dn,1000);printf(%7.2fn,123.4567);printf(%5.2fn,123.4567);printf(%2.7fn,123.4567);printf(%5sn,Cprogram);printf(%7.3sn,Cprogram);printf(%2.6sn,Cprogram);执行程序,结果如下:110100100000101010010000010101001000123.46123.46123.4567000CprogramCprCprogr分析程序的结果,可以看出:如果被打印的实际数据的宽度小于指定的宽度,则缺省下在宽度内为右对齐。左补空格或补0。直到总的数据个数满足宽度的要求。当指定的输出数据宽度小于数据的实际宽度时,则按实际数据的位数输出打印(宽度自动增加);对于整数而言,按该数的实际宽度输出;对于浮点数,按实际位数输出,但如果制定了浮点数的精度,则相应的小数位按精度的位数四舍五入;对于字符串,按实际串长度输出。通常情况下,精度用于描述浮点数的小数位数,但是,当采用精度描述整数或字符串时,如果被打印的整数数据包含的数字个数小于指定的精度,就在被打印数据的前面加0,直到总的数字个数等于该精度为止。而对于被打印的字符串,则精度确定该字符串左侧的字符个数,这些字符输出在指定域宽的右侧。不足域宽位数时左侧补以空格。在实际程序应用中,还有一种更为灵活的宽度和精度的控制方法,用整型常量或整型变量的值作为输出数据的域宽和精度。方法是以“*”取代域宽修饰符和精度修饰符放在%的后面,以计算出来的整数表达式的值作为宽度和精度。例如:float a=123.45;printf(“%*.*f”,6,1,a);此处6为输出宽度,1为输出精度,输出结果为: 123.5,右对齐。提示没有为要打印的数据提供足够大的宽度,使得其他被打印的数据发生位置偏移,从而产生令人费解的输出格式。4)标志修饰符 在printf 函数中,可以使用标志修饰符控制输出格式。常见的标志修饰符见表4。表4 标志修饰符及其作用标志修饰符意义

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论