第1页第四章格式化输入/输出和简单的顺序结构4.1格式化输入和输出一、格式化输出1.printf函数的使用格式printf(格式字符串,参数1,参数2,…,参数n);说明:(1)格式字符串中包含了普通字符和格式说明符。每个格式说明符以%开始,以一个转换符结束,在%和转换符之间可以使用一个或多个标志。(2)参数是表达式(包括常量、变量、带运算符的表达式和有返回值的函数的调用)。(3)每个格式说明符都用相应的参数值替换。格式说明符结尾的转换符将指示被格式化的数值类型:例如,f表示浮点数,c表示字符,d表示十进制整数。2.转换符表4-1用于printf的转换符(实例均在VC6.0环境下运行)转换符类型举例%d或%i有符号十进制整数inta=-2009,b=-0x123;printf(a=%i,b=%d,%d\n,a,b,0123);输出:a=-2009,b=-291,83%x或%X十六进制整数inta=164,b=-164;printf(a=%x,b=%X\n,a,b);输出:a=A4,b=ffffff5c%o八进制整数inta=164,b=-164;printf(a=%o,b=%o\n,a,b);输出:a=244,b=37777777534%u无符号十进制整数inta=164,b=-164;printf(a=%u,b=%u\n,a,b);输出:a=164,b=4294967132unsignedu1=182,u2=-182;printf(u1=%d,u1=%u\n,u1,u1);printf(u2=%d,u2=%u\n,u2,u2);输出:第2页u1=182,u1=182u2=-182,u2=4294967114%c字符charch='a';printf(ch=%c,ch=%x\n,ch,ch);输出:ch=a,ch=61%s字符串printf(ninetimes%s.,outoften.);printf(ninetimesoutoften.\n);输出:ninetimesoutoften.ninetimesoutoften.%f定点浮点数floatf=123.1;doubled=123.1;printf(f=%f,d=%f\n,f,d);输出:f=f=123.099998,d=123.100000说明:转换符f打印一个浮点数的整数部分和6位小数。%e或%E指数浮点数floatf=123.1;doubled=123.1;printf(f=%e,d=%E\n,f,d);输出:f=1.231000e+002,d=1.231000E+002说明:转换符e按规范化指数形式(科学记数法)打印浮点数,共13位,其中字母“e”占1位,指数部分占4位(1位是符号位),小数部分占据6位,整数数字和小数点各占1位。%g或%G通用浮点数(e和f中较短的)%p(相当于%X)打印变量的地址inta;printf(&a=%#p,&a=%#X\n,&a,&a);输出:&a=0X0012FF7C,&a=0X12FF7C%%打印%inta=15,b=-2;printf(%d%%%d=%d\n,a,b,a%b);输出:15%-2=1第3页3.标志表4-2用于printf的标志标志目的举例-使数据左对齐,默认情况下数据右对齐+打印正数的符号(不管是否使用+,负数打印时总带符号)inta=12;printf(a=%+d,a=%d\n,a,a);输出:a=+12,a=12宽度m打印的数据(包括整数、字符和字符串)占m个位置,当数据的实际位数不足m,根据对齐情况打印空格;否则按数据的实际位数打印inta=123,b=1234,c=-123;printf(a=%6d,b=%3d,c=%-6d.\n,a,b,c);输出:a=123,b=1234,c=-123.0当打印整数、字符和字符串时,数据的实际位数小于指定宽度时,在左边的空位上补0(此时标志0和-冲突);否则按数据的实际位数打印inta=-123,b=1234,c=123;printf(a=%-06d,b=%03d,c=%06d\n,a,b,c);输出:a=-123,b=1234,c=000123精度.n(1)当打印整数时,如果整数的位数比n少,就在左边的空位上补0;否则按实际位数打印(2)当打印浮点数时,如果浮点数的位数比n少,就在右边的空位上补0;否则按实际位数打印(3)当打印字符串时,如果字符串中字符个数比n少,就按实际字符数输出该串;否则就截断取字符串前n个字符打印inta=-123456;printf(a=%9d,a=%.9d\n,a,a);输出:a=-123456,a=-000123456doublea=-123.1,b=123.1;printf(a=%f,a=%.8f,b=%.4f\n,a,a,b);输出:a=-123.100000,a=-123.10000000,b=123.1000l打印long数据或double数据,默认情况下用%f也能打印double数据longa=1234567;printf(a=%d,a=%ld\n,a,a);输出:a=1234567,a=1234567h打印短整型数据shorta=12345;longb=123456;printf(%hd,a=%hd,b=%hd\n,12345,a,b);输出:12345,a=-7616,b=-10617第4页续表4-2#(1)#对于转换符x(X)、o添加前缀0x(0X)或0(2)#对于转换符f包含小数点inta=123;doubled=123.5;printf(a=%#o,a=%#X\n,a,a);printf(d=%.0f,d=%#.0f\n,d,d);输出:a=0173,a=0X7Bd=124,d=124.【例4.1】宽度标志和精度标志用于打印整数。#includestdio.hmain(){inta=-123,b=123;printf(a=%8d,a=%-8d,a=%3d\n,a,a,a);printf(a=%8.5d,a=%-8.5d,a=%3.5d\n,a,a,a);printf(b=%x,b=%X\n,b,b);printf(b=%#x,b=%#X\n,b,b);printf(a=%x,a=%X\n,a,a);printf(b=%-#16.12x,a=%#16.12x\n,b,a);}【例4.2】宽度标志和精度标志用于打印字符和字符串。#includestdio.hmain(){charch='a';printf(ch=%-5c,ch=%5c\n,ch,ch);printf(%-7s,%7s\n,CHINA,CHINA);printf(%-7.3s,%7.2s\n,CHINA,CHINA);}【例4.3】使用多种标志格式化输出浮点数。#includestdio.h第5页main(){floatf=-1.2345675f;doubled=-153.4567885;doubleaf=123.456e12;printf(f=%f,d=%f\n,f,d);printf(f=%-11f,d=%6f\n,f,d);printf(f=%-11.3f,d=%6.9f\n,f,d);printf(d=%e,d=%E\n,d,d);printf(d=%18.6e,d=%2.4E\n,d,d);printf(f=%f,f=%e,f=%g\n,f,f,f);printf(af=%f,af=%e,af=%g\n,af,af,af);}4.printf格式说明符的语法图二、格式化输入1.scanf函数的使用格式scanf(格式字符串,&变量名1,&变量名2,&变量名3,…,&变量名n);说明:(1)格式字符串的说明同printf,由普通字符和格式说明符组成,普通字符原样输入。(2)scanf格式字符串后面要列出若干变量的地址,每个变量用于保存用户在对应的格式说明符的位置上输入的数据。(3)转换符将指示用户在该格式说明符的位置上输入的数据的数值类型:例如,f表示浮点数,c表示字符,d表示十进制整数。2.转换符表4-3用于scanf的转换符(实例均在VC6.0环境下运行)%标志宽度精度.转换符第6页转换符类型举例%d或%i输入十进制整数inta,b;scanf(%d%d,&a,&b);printf(a=%d,b=%d\n,a,b);输入:-365365输出:a=-365,b=365%x或%X输入十六进制整数inta,b;scanf(%x,%X,&a,&b);printf(a=%d,a=%x\nb=%d,b=%x\n,a,a,b,b);输入:a4,-a4输出:a=164,a=a4b=-164,b=ffffff5c%o用户输入八进制整数inta;scanf(a=%o,&a);printf(a=%d,a=%o\n,a,a);输入:a=-244输出:a=-164,a=37777777534%u输入十进制无符号整数unsignedu1,u2;scanf(u1=%u,*u2=%u,&u1,&u2);printf(u1=%d,u2=%u\n,u1,u2);输入:u1=182,*u2=-182输出:u1=182,u2=4294967114%c输入字符charch;scanf(ch:%c,&ch);printf(ch=%c\n,ch);输入:ch:A输出:ch=A%s输入字符串需要用字符数组来保存输入串%f输入定点浮点数floatf;doubled;第7页scanf(%f%lf,&f,&d);printf(f=%f\nd=%f\n,f,d);输入:123.456789-123.456789输出:f=123.456787d=-123.456789%e或%E输入指数浮点数doubled1,d2;scanf(%le%le,&d1,&d2);printf(d1=%f\nd2=%e\n,d1,d2);输入:12.34e1123.4输出:d1=123.400000d2=1.234000e+002%g或%G等价于%f、%e或%E3.标志表4-4用于scanf的标志标志目的举例宽度m指定输入数据所占位数,遇空格或不可转换字符结束inta,b;scanf(%3d%2d,&a,&b);printf(a=%d,b=%d\n,a,b);输入:12345678输出:a=123,b=45输入:12345678输出:a=123,b=4*表示跳过输入inta,b;scanf(%3d%*2d%2d,&a,&b);printf(a=%d,b=%d\n,a,b);输入:123456789输出:a=123,b=67输入:123456789第8页输出:a=123,b=67l用于转换符d、u、o、x(X)表示输入long整数;用于e(E)、f表示输入double实数longli;scanf(li:%ld,&li);printf(li=%d\n,li);输入:li:-1234输出:li=-1234输入:li:-1234L输出:li=1234h用于d、u、o、x(X)表示输入short整数【例4.4】输入字符数据时要注意的问题。#includestdio.hmain(){charc1,c2,c3;scanf(%c%c%c,&c1,&c2,&c3);printf(c1=%c,c2=%c,c3=%c\n,c1,c2,c3);}4.scanf格式说明符的语法图%*宽度转换符lh第9页4.2常用库函数简介一、字符数据输入/输出函数C语言针对字符数据的输入/输出,向用户提供使用更为方getchar和putchar等函数。【例4.5】getchar与putchar。#includestdio.hmain(){charch='\101';putchar(ch);putchar(0x61);putchar('\n');ch=getchar();putchar(ch);}【例4.6】getche和getch。#includestdio.hmain(){charch1,ch2;printf(pleasepr