不同类型数据的输入输出 老师:teacher 来源:C 点击:427 2.5 不同类型数据的输入输出 2.5.1 printf() 函数 格式输出函数printf()在第一章已简要介绍过,本节对它进行综合性介绍。 printf()函数可以用于所有类型数据的输出,采用不同的格式转换说明符将不同类型的数据 输出到标准输出设备上。可以使用的格式转换说明符示于表2.4。 表2.4 printf()格式转换说明符
格式转换说明符可以加下列修饰符: 1. 指定字段宽度 在百分号和格式字母之间加一个整数可以规定输出的最小字段宽度。 (1)%m.nd m规定输出的字段总宽度,n规定输出的最小有效位数。如果被输出量的实际位数小于m,则左端补空格; 如果被输出量的实际位数大于m,则按实际位数输出。如果被输出量的实际有效位数大于n,则n不起作用; 如果实际有效位数小于n,则左边补0直至n位。例如 printf(%3d,%6d,%6.5d\n”,1250,1250,1250); 输出结果为 1250, 1250, 01250 (2)%m.nf m规定输出的字段总宽度,n规定输出的小数位数。如果实际数据的tensorflow清华镜像整数位数小于m-n-1,则左端填充空格。 如果实际数据的整数位数大于m-n-1,则m不起控制作用,按实际数据应有的位数输出。例如 printf(%10f,%10.2f,%.2f\n,123.456,123.456,123.456); 输出为 123.456000, 123.456,123.456 如果不规定m和n,则m取被输出量的实际位数,n取6。 (3)%m.ne m规定输出的字段总宽度,n-1规定尾数部分的小数位数。例如 printf(%10e,%10.4e,%.3e\n,123.456,123.456,123.456); 输出为 1.23456e+02, 1.235e-02,1.23e+02 其中,“%10e未指定n,系统自动按n=5处理,即5位小数;因为输出的实际位数已超过10列,故输出11列; “%10.4e指定m=10、n=4,即输出总宽度为10,小数3位,实际总位数为9位,所以左边留有一个空格; “%.3e未指定m,则系统自动取m等于实际数据应占的长度,本例中为8位。 在上述3种情况下,如果在百分号与m.n之间加一个0,则左边多余的空位用0而不是用空格填充。 例如 printf(%04d,%06d,%03d\n”,1250,1250,1250); 输出结果为 1250,001250,1250 (4)%m.ns m规定输出的字段总宽度,n规定只输出字符串中n个字符。若字符串长度小于m,则左边补充空格; 若字符串长度大于m,则m不起作用;若字符串长度小于n,则n不起作用;若字符串长度大于n, 则只输出左边n个字符,多余的字符被截断。例如 printf(%3s,%15s,%10.5s,%.8s\n,abc,defghij,klmnopqrst,uvwxyz); 输出结果为 abc, defjhij, klmno,uvwxyz 2. 左对齐 在缺省情况下,所有的输出右对齐,如果指定的字段宽度大于实际位数,左边填充空格或零。 在百分号后边加一个减号,如%-m.nd、%-m.nf、%-m.ns等,可使输出左对齐,右边填充空格。 例如 printf(%-10.2f,%-5.2f\n,123.456,1.23456e2); 输出为 123.46 ,123.46 printf(%-10s,%-5s,%-10.5s,%-.8s\n,abc,defghij,klmnopqrst,uvwxyz); 输出结果为 abc ,defghij,klmno ,uvwxyz 3. 类型修饰 (1) 在类型说明符d、i、o、u、x前面可以加字母l或h,分别表示long或short。例如%ld表示 输出long int型,%hu表示输出short unsigned int型等。请看下例: printf(%d,%8ld,%ld\n,7000,70000l,70000l); 输出结果为 7000, 70000,70000 前面已经说过,C语言能自动进行十进制、八进制和十六进制整数之间的转换。仅就printf函数而言, 任何一个整数,不管它是十进制、八进制还是十六进制,都可以用十进制、八进制或十六进制方式输出。 在printf函数中,控制符“%o用来输出无符号形式的八进制数,“%lo用来输出无符号形式的 八进制长整数;“%x或“%X用来输出无符号形式的十六进制数,“%lx或“%LX用来输出无符 号形式的十六进制长整数。以上控制符都不能输出负数,而是根据整数的存储形式,将其视为无 符号数输出。 例如 printf(%x,%o,%d\n,-1,-1,-1); 输出结果为 ffff,177777,-1 因为十进制整数-1的存储格式为(补码形式):
将它视为无符号十六进制,其值为FFFF;将它视为无符号八进制数,其值为177777。 又如: printf(%o,%o,%lo\n,-01234,01234u,0123ul); 输出为 176544,1234,1234 printf(%x,%x,%lx\n,-0x6A3B,0x6A2Bu,0x6A2Bul); 输出为 95c5,6a3b,6a3b printf(%o,%x,%d,0177,01777,0177); 输出为 177,7f,127 printf(%o,%8x,%d,0xABC,0xABC,0xABC); 输出为 5274, abc,2748 (2)在类型说明符f、e、g前面可以加字母l,表示输出double型或long double型, 因为用%f、%e、%g格式输出double或long double型数时,会输出错误结果。 4. 对%u格式的说明 %u格式用无符号十进制整数的方式输出。如果输出的是有符号数,则把符号位视为数的一部分。 例如 printf(%u,%u,%u\n,65533u,65534u,65535u); 输出结果为 65533,65534,65535 而 printf(%u\n,-32768); 则输出 32768 这是因为-32768是一个有符号整数,其补码形式为
按无符号数处理,即为32768;而-2也是一个有符号整数,其补码形式为
按无符号数处理,即为65534。 反之,如果将一个无符号数,按%d格式输出,则会将其最高位视为符号,其余部分按补码处理。 例如: printf(%d\n,65535u); 输出结果为 -1 因为无符号数65535的存储形式为
按补码处理,其值为-1。 对无符号长整数,则可用lu格式输出,如 printf(%lu\n,700000ul); 输出结果为 700000 5. %n的功能是将本printf()函数中位于%n之前输出的字符个数存放在它所对应的整型变量的地址中。 例如 main() { int i; printf(Where are%n you?,&i); printf(%d\n,i); } 程序运行结果为 Where are you? 9 在第一个printf函数中,在%n之前输出的是字符串“Where are,显然它含9个字符。 前面曾说到零字符常量('\0')和空字符串常量()及零字符串常量(\0)之间的区别,可以用下面的例题来验证。 例2.5 main() { printf(%c,%c,%s,%s,%s,%s\n,’A’,’\0’,A,,\0,A); } 程序输出结果为: A, ,A,, ,A 可以看出,当输出字符常数'\0'时,不显示任何字符,但空出一个字符的位置; 当输出空字符串时,既不显示字符也不空出位置; 输出字符串\0时,不显示字符,但空出一个字符的位置。 6. 当printf()函数中出现多个表达式输出项(见第3章例题)时,Turbo C规定,printf按照从右到左的顺序计 算各表达式的值,然后再显示结果。 2.5.2 scanf()函数 格式输入函数scanff()也在第1章简要介绍过,本节对它进行综合性介绍。 scanf()函数可以用于所有类型数据的输入,采用不同的格式转换说明符将不同类型的数据从标准 输入设备读入内存。可以使用的格式转换说明符示于表2.5。 表2.5 scanf()格式转换说明符
除了第1章已对scanf()函数做过的说明外,这里再说明几点。 1. 输入数据之间的分隔符 当一个scanf()函数中包含若干个输入项或几个scanf()函数连续出现时,可以同时输入几个数据, 各数据之间只能用空格、制表符或回车键分隔,其他符号都不能作为分隔符。例如 scanf(%d%d,&a,&b); 其中a和b都是int型变量,则键盘输入 10 20↓ 时能正确接收,而输入 10,20↓ 则不能被正确接收。 2. 输入的数据类型 当用%d控制int型变量时,键盘输入的数据必须是整数;当用%f或%e控制float型或double型变量时, 键盘输入的数据可以是整数(不带小数点)、定点表示(带小数点)或指数形式(如2e-3、3.6e4等) 表示的实数,函数会自动进行转换。 用%c控制char型变量时,输入的字符不必加单引号,如果连续几个char型数据同时输入时,不要使用分隔符。 用%s控制字符串时(将在第五章介绍),输入的字符串不必加双引号,但遇到空格、制表符或换行符时将终止接收。 3. 抑制赋值 在百分号之后、转换控制字符之前加进一个星号时,scanf()函数将正常读入对应的数据,但不赋值。 例如,%*c将抑制一个输入的字符;%*d将抑制一个输入的整数等。例如 scanf(%d%*c%d,&a,&b); 若从键盘输入 10/20↓ 则函数把10赋给a,20赋给b,而“/被忽略。即%*c的作用是跳过一个输入字符。又如 scanf(%d%*d%d,&x,&y); 当输入 电子表单怎么做10 20 30↓ 时,变量xputchar函数得到10,y得到30,而20被忽略。即%*d的作用是跳过一个整数。 4. 限制接收字符个数 在百分号和控制字符之间插进一个整数可以限制从输入数据中接收的字符个数。 如果希望整型数不超过4位,可用 scanf(%4d%4d,&h,&k); 若输入 123 32658↓ 时,函数将123赋给变量h(输入的数据不足4位,以输入的位数为准), 将3265赋给变量k(输入的数据超过4位,只取前4位)。 再如,这种限制常用在字符串的输入中,可以防止因遇到空格等字符使输入提前终止。 scanf(%10s,str); 假设str是一个字符型数组,长度为20个字符。若输入 good morning↓ 时,接收的字符串为“good morni,多余的字符被截断。如果不用%10s来限制,同样的输入, str只能接收到python一级什么水平“good,空格后面的字符被截断。 采用限制接收字符个数的方法还可以将一串字符赋给多个变量,例如 scanf(%5f%f,&r,&g); 当输入 1.23456789↓ 时,函数将1.234赋给变量r(包括小数点在内共5位),将56789.0赋给变量g(余下的数据仍有效)。 2.5.3 字符输出输入函数(putchar()、getchar()) putchar()和getchar()函数用于单个字符的输出和输入,它们定义在标题文件中, 使用起来要比scanf()和printf()简洁。 1. putchar()函数 putchar()函数的一般格式为 putchar(c); 其中,c是一个字符型常量或变量,也可以是一个取值不大于255的整型常量或变量。 它的功能是向标准输出设备输出一个字符。 例2.6 用putchar()函数输出一个字符。 #include <stdio.h> main() { int c; char d; c=65; d='A'; putchar(c); putchar(d); putchar('A'); putchar(65); } 程序中的四个putchar()函数输出完全相同的结果,屏幕显示为: AAAA 用putchar()函数还可以输出不可显示字符或控制字符。例如,用 putchar(’\n’) 可以控制换行,用 putchar(’\a’)或putchar(’\07’) 可以输出一声铃响。 2. getchar()函数 getchar()函数的一般格式为 getchar(); 这是一个不带参数的函数,即圆括号中没有参数,但圆括号不能省略。 getchar()函数的功能是从标准输入设备接收一个字符。 例2.7 用getchar()函数输入一个字符。 #include <stdio.h> main() { char c; c=getchar(); printf(%c\n,c); printf(%d\n,c); } 程序运行时,等待用户从键盘输入字符,假设用户按了字母a及回车键,则屏幕显示: a↓ a (printf()函数按字符格式显示c的值) 97 (printf()函数按整数格式显示c的值) getchar()还可以作为putchar()的参数,例如 putchar(getchar()); 其功能是显示用户从键盘输入的字符。 使用getchar()函数时,回车键也作为输入字符的一部分。尤其在连续使用该函数时要特别注意 回车符可能已作为换行符被接收并存入另一个变量中。例如 #include <stdio.h> main() { char c,d; c=getchar(); d=getchar(); printf(%c\n,c); printf(%d\n,d); } 程序运行时,用户同样按了字母a及回车键,则屏幕显示: a↓ a (printf()函数按字符格式显示c的值) 10 (printf()函数按整数格式显示d的值) 2.5.4 单字符输入函数(getche()和getch()) 使用getchar()函数时,输入一个字符必须按回车键后才能被接收。这是由于最初的UNIX操作系统 的行缓冲区被设计成必须接收回车键后才能把输入的字符送往程序。这种输入方式有时会和环境 很不协调,于是人们更多地使用getche()和getch()函数。这两种函数的最大特点是:功能上与 getchar()类似,但输入字符后不必按回车键。 getche()和getch()定义在标题文件中。 getche()函数的使用与getchar()完全相同。如果我们把例2.7中的换成, 把语句c=getchar()换成c=getche()后,程序运行时除了输入字符不必按回车键以及把输入的 字符回显在屏幕上之外,其余完全相同。 #include <stdio.h> main() { char c; c=getche(); printf(%c\n,c); printf(%d\n,d); } 程序运行时,用户只要按字母a,屏幕立即显示: aa (第一个a是用户输入的,第二个a是getche()函数回显的) a (printf()函数按字符格式显示c的值) 97 (printf()函数按整数格式显示c的值) 与getche()相比,getche()把输入的字符回显在屏幕上,而getch()则不回显,这对输入密码和选择菜单特别有用。 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论