本文将盘点一些易错的输入输出问题,并附输入输出格式详细说明。为方便编写和浏览,以下输入部分以<Space>和<Enter>代表空格键和回车键。
目录
易错题
1.程序段:int x=12;double y=3.141593;printf("%d%8.6f\n",x,y); 的输出结果是()。
A.123.141593 B.12 3.141593 C.12,3.141593 D.123.1415930
----------------------------------------------------分割线------------------------------------------------------------
正确答案:A
解析:在printf()函数使用时,会严格按照引号内内容输出,%d和%f8.6中间是连续的,没有其他字符,故C错误;%8.6的意思是输出宽度为8,小数点后有六位,D超过小数位数,故错;而3.141593正好8位(小数点也算一位),无需左端补空格,B错。即A对。
2. 有以下程序:
#include <stdio. h>
void main()
{ char a,b,c,d;
scanf(″%c%c'',&a,&b);
c=getchar( );
d=getchar( );
printf("%c%c%c%c",a,b,c,d);
}
当执行程序时,按下列方式输入数据
12<CR>
34<CR>
则输出结果是 ()。
A.1234 B.12
C.12 <Enter>3 D.12<Enter>34
----------------------------------------------------分割线------------------------------------------------------------
正确答案:C
解析:程序根据用户输入分别给字符型变量a、b、c、d赋值为‘1’、‘2’、‘<Enter>’、‘3’,因此输出到屏幕得到选项C中的格式。
3.已知int x;float y;执行:scanf("%3d%f",&x,&y);语句时,从键盘输入数据12345<Space>678后,y的值为 () 。
A.无确定值 B.45.000000 C.678.000000 D.123.000000
----------------------------------------------------分割线------------------------------------------------------------
正确答案:B
解析:输入12345,本来是把这个值传递给整形的变量x的,但是因为%3d截断了3位传递给x,所以x的值就是123,剩下的45就传给了float类型的y。
4.以下叙述中正确的是( )。
A.输入项可以是一个实型常量,例如:scanf( “%f” ,3.5);
B.只有格式控制,没有输入项,也能正确输入数据到内存,例如:scanf(“a=%d,b =%d” );
C.当输入一个实型数据时,格式控制部分可以规定小数点后的位数,例如:scanf( “%4.2f” ,&f);
D.当输入数据时,必须指明变量地址,例如:scanf( “%f”,&f);
----------------------------------------------------分割线------------------------------------------------------------
正确答案:D
解析:A. scanf( )函数的功能是:从键盘读取输入的数据,所以不能直接输入常量或变量,故A错误。scanf()在参数列表里使用的是指向变量的指针,当输入数据时,必须指明变量地址,故B错,D对。scanf()仅能控制最大字段宽度,不能控制小数点后的位数,C错。
5.设a=12、b=12345,执行语句printf(“%4d,%4d”,ab)的输出结果为()。
A.12,123
B.12 12345
C.12,1234
D.12, 123456
----------------------------------------------------分割线------------------------------------------------------------
正确答案:B(易错选C)
解析:%4d仅能控制字段宽度的最小值。(不够补空格)而如果该字段不能容纳要输出的数或者字符串,系统就会使用更宽的字段。、
6.若输入12345和abc,以下程序的输出结果是()。
main()
{
int a;
char ch;
scanf(“%3d%3c”,&a,&ch);
printf(“%d,%c”,a, ch);
}
A.123,abc
B.123,4
C.123,a
D.12345,abc
----------------------------------------------------分割线------------------------------------------------------------
正确答案:B(易错选A)
解析:指定输入数据所占列数之后,系统自动按它截取所需数据,无须分界符。程序中指定整型变量a占3列,输入12345、abc后,系统自动将数据前3列123赋给变量a,而剩余的数据则根据具体情况赋给其他变量或作为多余数据处理。因程序中还需对字符变量ch输入数据,虽然指定输入3列字符,但字符型数据只能有一个字符,因此把剩余的“45、abc”中第1个数据4赋给变量ch,故正确答案为选项B。
附录:
1.printf()函数的输出格式详细说明
表1 格式说明符及输出效果
格式说明符 | 输出效果 |
%c | 一个字符 |
%d | 有符号十进制整数 |
%f | 浮点数,十进制记数法 |
%e | 浮点数,e记数法 |
%E | 浮点数,E记数法 |
%g | 根据数值不同自动选择%f或%e,%e格式在指数 < -4 或 >= 精度时使用 |
%G | 根据数值不同自动选择%f或%E,%E格式在指数 < -4 或 >= 精度时使用 |
%i | 有符号十进制整数(与%d相同) |
%o | 无符号八进制整数 |
%p | 指针 |
%s | 字符串 |
%u | 无符号十进制整数 |
%x | 使用十六进制数字0~f的无符号十六进制整数 |
%X | 使用十六进制数字0~F的无符号十六进制整数 |
%% | 输出一个百分号 |
此外,在控制字符串中,我们还可以在%和格式字符之间插入修饰符,对基本的格式说明加以修改。在表2和表3中,列举了可以插入的修符。
表2 printf( )的修饰符
修饰符 | 意义 |
标志 | 5种标志(-、+、空格、#、0)将在表3中描述。可以使用零个或者多个标志。示例: "%-10d" |
digit(s) | 字段宽度的最小值。如果字段宽度不够,则左补空格。如果该字段不能容纳要输出的数或者字符串,系统就会使用更宽的字段。示例:"%4d" |
.digit(s) | 精度。 对于%e、%E、%f格式,是将要在小数点右边输出的数字位数。 对于%g和%G格式,是有效数字的最大位数。 对于%s格式,是将要输出字符的最大数目。 对于整数格式, 是将要输出数字的最小位数; 如果必要,要使用前导零来达到这个位数。只使用“.”表示其 后跟随一个零,所以%.f与%.0f相同。 示例: "%5.2f"为输出一个浮点数,其宽度为5个字符,小数点后有2个数字。 "%5.3s"为输出一个字符串,其宽度为5个字符,但只取字符串中左端3个字符。这3个字符输出在5列的右侧,左补空格。 |
h | 和整数格式说明符一起使用,表示一个short int或unsigned short int类型数值。示例: "%hu"、"%hx"、"%6.4hd" |
l | 和整数格式说明符一起使用,表示一个long int或unsigned long int类型数值。示例: "%ld"、"%8lu" |
L | 和浮点数格式说明符一起使用,表示一个long double类型数值。示例:"%Lf"、"%10.4Le" |
表3 printf()的标志
标志 | 意义 |
- | 左对齐。也就是说,将输出的数据置于字段的左侧开始处 。如果字段宽度不够,则左补空格。示例:"%-20s" |
+ | 对有符号数,若为正数,则显示加号;若为负数,则显示减号 示例:"%+6.2f" |
(空格) | 对有符号数,若为正数,则显示时带前导空格(但不显示正号);若为负数,则显示负号(空格) 示例:"%↵6.2f" |
# | 使用格式说明的可选形式。若为% o格式,则以0开始;若为%x或%X格式,则以0x或0X 开始。对于所有的浮点数形式,#保证了即使不跟任何数字,也输出一个小数点字符。对 于%g和%G格式,它防止尾随零被删除 示例:"%#o"、"%#8.0f"、"%+#10.3E" |
0 | 对于所有的数字格式,用前导零填充字符宽度。如果出现了一标志或指定了精度(对于整数) 则忽略该标志 示例:"%010d"、"%08.3f" |
2. scanf( )函数的输入格式详细说明
scanf( )函数的功能是:从键盘读取输入的数据。它是printf( )函数的逆操作。和printf( )函数一样,scanf( )函数也用到了控制字符串和参数列表,但是scanf()在参数列表里使用的是指向变量的指针,如表4和表5所示。
表4 scanf( )函数的格式说明符
格式说明符 | 输入数据 |
%c | 读入一个字符 |
%d | 读入一个有符号的十进制整数 |
%f、%e、%g | 读入一个浮点数 |
%F、%E、%G | 读入一个浮点数 |
%i | 读入一个有符号的十进制整数(与%d相同) |
%o | 读入一个有符号的八进制整数 |
%p | 读入一个指针 |
%s | 读入一个字符串,输入内容以第一个非空格字符作为开始,直到下一个空格字符之 间的全部字符 |
%u | 读入一个无符号的十进制整数 |
%x、%X | 读入一个有符号的十六进制整数 |
表5 scanf()函数的格式修饰符
修饰符 | 意义 |
* | 本输入项读入后略去。示例:scanf("%2d%*3d%2d",&a,&b);输入1234567↓,则系统将 12赋值给a变量,345略去,67赋值给b变量 |
digit(s) | 最大字段宽度。在达到最大字段宽度或遇到第一个空格字符时停止对输入项的读取。示 例:"%10s" |
h | 用于输入short int类型整数(如"%hd,%ho,%hx") |
l | 用于输入long int类型整数(如"%ld,%lo,%lx")以及double类型实数(如"%lf,%le") |