2024年5月9日发(作者:)

二级C

考点速记、题解与模拟

考点1 字符型常量与变量

考点 字符型常量与变量

1

1.字符常量

一个字符常量代表ASCII字符集中的一个字符,在程序中用单引号把一个字符括起来作为字符常量。例如,

'A'、'a'都是合法的字符常量。

【说明】

① 单引号中的大、小写字母代表不同的字符常量。例如,'A'、'a'是不同的字符常量。

② 单引号中的空格符也是一个字符常量,如'□'(□表示1个空格),但不能写成两个连续的单引号('')。

③ 字符常量只能包括一个字符,因此'abc'是非法的。

④ 字符常量只能用单引号括起来,不能用双引号括起来。例如,"d"不是字符常量,而是一个字符串。

2.转义字符常量

转义字符又称反斜线字符,这些字符常量总是以一个反斜线开头后跟一个特定的字符,用来代表某一个特定

的ASCII字符,这些字符常量也必须括在一对单引号内。C语言中的转义字符见表2-1。

表2-1 转义字符及其功能

字符形式

n

t

v

r

f

b

回车换行

横向跳若干格(代表“Tab”键)

竖向跳格

回车符

换页符

退格符(代表“Backspace”键)

功能

'

"

ddd

xhh

0

字符形式

反斜杠字符

单引号(撇号)字符

双引号字符

3位八进制数代表的一个ASCII字符

2位十六进制数代表的一个ASCII字符

空值,其ASCII码值为0

功能

【说明】

① 转义字符常量只代表一个字符。例如,'n'、'101'、'141'。

② 反斜线后的八进制数可以不用0开头。例如,'101'代表的就是字符常量'A'。

③ 反斜线后的十六制数只可由小写字母x开头(不能以大写字母X或0x开头)。

3.字符串常量

字符串常量是由双引号括起来的一串字符。

在C语言中,字符串是借助于字符型一维数组来存放的,并规定以字符'0'作为“字符串结束标志”。

'0'是一个转义字符,称为空值,它的

ASCII码值为0。'0'作为标志占用存储空间,但不计入字符串的实际

长度。

26

第2章 顺序结构

【说明】

① 在C语言中,系统在每个字符串的最后自动加入一个字符('0')作为字符串的结束标志。

② 两个连续的双引号("")也是一个字符串常量,称为空串,但占一个字节。

小提示

使用时应注意字符常量和字符串常量的区别。例如,'Z'是字符常

量,在内存中占一个字节;"Z"是字符串常量,在内存中占两个字节,

其中一个字节用来存放结束符('0')。

4.字符常量的运算

① 在C程序中,字符量可参与任何整数运算。

② 通过算术运算把数字字符转换为整数值或把一位整数转换为数字字符。

③ 字符可以进行关系运算。

5.字符变量

C语言中,字符变量用关键字char进行定义,定义时可同时赋初值。例如,char ch='a';

字符变量在内存中占一个字节,可以存放ASCII字符集中的任何字符。当把字符放入字符变量中时,字符

变量中的值就是该字符的ASCII码值,所以字符变量可以作为整型变量来处理,可以参与对整型变量所允许的

任何运算。

真题1 数字字符0的ASCII值为48,运行下列程序的输出结果是( )。【2005.4】

main( )

{ char a='1',b='2';

printf("%c,", b+ +);

printf("%dn", b-a);

}

A)3,2 B)50,2

C)2,2 D)2,50

答案:C)

解析:自增运算符“++”出现在变量之前,表示先使变量的值加1,再使用变量的值进行运算;出现在变量

之后,表示先使用变量的值进行运算,再使变量的值加1,例如题中的“b++”。题中第一条语句先输出字符b的

值,此时变量b='2',因此输出值为2;再使b的值加1,b='3',因此第二条语句输出:b-a='3'-'1'=2。

真题2 下列程序的输出结果是( )。【2005.4】

main( )

{ char a[7]="a00a00"; int i,j;

i=sizeof(a);

j=strlen(a);

27

二级C

考点速记、题解与模拟

printf("%d %dn",i,j);

}

A)2 2

C)7 2

答案:C)

解析:函数sizeof(a)的功能是:求出字符串a中的字符占用存储空间的大小,由于字符数组a的长度为7,

所以i=7;函数strlen(a)的功能是:求出字符串a的长度。而每个字符串都以'0'为字符串的结束标记,所以j的

值等于2。

真题3 下列不合法的字符常量是( )。【2006.4】

A)'018' B)'" '

C)'' D)'xcc'

答案:A)

解析:在C语言中,一个字符常量代表ASCII字符集中的一个字符,在程序中用单引号把一个字符括起来

用为字符常量。转义字符常量也是必须括在一对单引号内,以一个反斜线开头后跟一个特定的字符,用来代表某

一个特定的ASCII字符。在选项A)中,'018'是用八进制数来代表一个字符常量,所以其中的数字只能小于8,

并不包括8。选项B)、C)、D)都是正确的转义字符常量。

真题4 下列能正确定义字符串的语句是( )。【2006.4】

A)char str[ ]={'064'};

C)char str=";

答案:D)

解析:字符串常量是用一对双括号括起来的一串字符。它用字符数组来存放,不用一对花括号括起来。

真题5 下列合法的字符型常量是( )。【2007.4】

A)'x13' B)'081'

C)'65' D)"n"

答案:A)

解析:C语言的字符常量是用单引号(')括起来的一个字符,也可以用以一个“”开头的字符序列来表示

字符常量。其中形式ddd表示1~3位八进制数所代表的字符;形式xhh表示1~2位十六进制数所代表的字符。

在本题中'x13'表示回车符,是一个字符常量;而'081'用八进制数所代表的字符形式不正确,因为八进制数所表

示的字符中不会出现数字“8”;'65'单引号(即撇号)括起来的不是一个字符,而是一个十进制数字;"n"是用双

引号括起来的一个字符,表示一个字符串,而不是字符常量。

真题6 已知大写字母A的ASCII码是65,小写字母a的ASCII码是97。下列不能将变量c中的大写字母转换

为对应小写字母的语句是( )。【2007.4】

A)c(c-'A')%26+'a' B)c=c+32

C)cc-'A'+'a' D)c=('A'+C)%26-'a'

答案:D)

解析:由题意可知,小写字符a和大写字符A的ASCⅡ码相差32,所以选项C)能将大写字母C的ASCⅡ

代码转换为小写字母c的ASCⅡ码;选项A)和B)右侧的表达式都是大写字母C与大写字符A的差与'a' 的ASC

Ⅱ码的和就是小写字母c的ASCⅡ码。而选项D)中应该是加上'a',而不是减去'a'。

真题7 下列程序的输出结果是

。【2007.4】

28

B)7 6

D)6 2

B)char str="kx43";

D)char str[ ]="0";

第2章 顺序结构

#include

main( )

{ char a[ ]={'1', '2', '3', '4', '0'};

printf("% d%dn",sizeof(a),strlen(a));

}

答案:5 4

解析:根据字符数组a[ ]的初始化,可知其大小共占5个字节,由于字符'0'表示字符串的结束标志,不计入

字符数组a[ ]的长度内,所以由函数strlen(a)计算出字符数组a[ ]的有效字符长度为4。

真题8 已知字符'A'的ASCII码值是65,字符变量cl的值是'A',c2 的值是'D'。执行语句printf("%d,%d",c1,c2-2) ;

后,输出结果是( )。【2007.9】

A)A,B B)A,68

C)65,66 D)65,68

答案:C)

解析:在C语言中,字符常量在内存中占一个字节,存放的是字符的ASCⅡ码值。所有的字符常量都作为整

型量来处理。在本题中输出语句用整型格式输出字符时,输出的是其ASCⅡ码值。因为字符'A'和'D'的ASCⅡ码值

分别为65和68,所以c2-2=68-2=66。

真题9 下列正确的字符串常量是( )。【2007.9】

A)"" B)'abc'

C)Olympic Games

答案:D)

解析:字符串常量是由双引号括起来的一串字符。在C语言中,以一个反斜线开头后跟一个特定的字符,

用来代表一个特定的ASCⅡ字符。所以选项A)中的“”被编译系统解释为转义字符,选项A)错误,选项B)

和C)显然不是字符串常量。选项D)中两个连续的双引号("")是一个字符串常量,称为空串。

D)" "

考点2

函数与函数

考点 p

putchar

utchar函数与g

getchar

etchar函数

2

(1)putchar函数用于输出字符

【格式】putchar(ch)

【说明】ch可以是字符变量或是字符常量,在以上函数调用的后面跟一个分号“

;”,就形成一行独立的输出

语句。

(2)getchar()函数用于输入字符

【格式】ch= getchar()

【说明】getchar()后的一对圆括号内没有参数,但这一对圆括号不可少,getchar()函数从终端读入一个字符

29

二级C

考点速记、题解与模拟

作为函数值。以上调用形式把读入的一个字符赋给变量ch。

小提示

在输入时,空格、回车符都将作为字符读入,而且只有在用

户输入回车时,读入才开始执行。

真题1 要求通过while循环不断读入字符,当读入字母N时结束循环。若变量已正确定义,下列正确的程序段

是( )。【2006.4】

A)while( (ch=getchar( ))! ='N') printf("%c",ch);

B)while(ch=getchar( )! ='N') printf("%c",ch);

C)while(ch=getchar( )= ='N') printf("%c",ch);

D)while((ch=getchar( ))= ='N') printf("%c",ch);

答案:A)

解析:while循环的执行过程如下:(1)计算while后面圆括号中表达式的值。当值为非0时,执行步骤(2);

当值为0时,执行步骤(4)。(2)执行循环体一次。(3)转去执行步骤(1)。(4)退出循环。在选项A)中,表

达式(ch=getchar())!='N'表示输入的字符不等于N,如果这个条件表达式成立,则执行循环体,打印输出输入

的字符。如果这个条件表达式不成立,即输入的字符等于N,则退出循环。

真题2 有下列程序:【2006.4】

#include

main( )

{ char c1,c2,c3,c4,c5,c6;

scanf("%c%c%c%c",&c1,&c2,&c3,&c4);

c5=getchar( ); c6=getchar( );

putchar(c1);putchar(c2);

printf("%c%cn",c5,c6);

}

程序运行后,若从键盘输入(从第1列开始)

123

45678

则输出结果是( )。

A)1267 B)1256

C)1278 D)1245

答案:D)

解析:当用scanf函数从键盘输入数据时,每行数据的未尾按下回车键(Enter键)之前,可以任意修改。

但按下回车键之后,scanf函数即接受了这一行数据,不能再回去修改。所以本题中,当输入123时,变量

c1、c2、c3的值分别为1、2、3,当输入45678时,变量c5、c6的值为4、5。所以用输出函数putchar(c1)

30

第2章 顺序结构

输出1,putchar(c2)输出2,printf("%c%cn",c5,c6)输出45。

真题3 当执行下列程序时,输入1234567890,则其中while循环体将执行 次。【2007.4】

#include

main( )

{ char ch;

while((ch=getchar( ))=='0')printf("#");

}

答案:0

解析:由程序语句while((ch=getchar())=='0')printf("#");可知当输入的字符等于'0'时,while循环执行一次。

而当程序执行时,输入的为1234567890,其值不等于字符'0',因而while循环语句的条件不成立,所以while循

环语句一次都不执行。

考点

函数

考点

3

p

printf

rintf函数

3

1.printf函数的一般调用形式

【功能】printf函数用于输出信息

【格式】printf(格式控制,输出项1,输出项2,…)

【说明】“格式控制”是字符串形式,“输出项”是要输出的字符或变量名。

在printf函数的调用之后加上“;”,则构成输出语句。

例如,printf("a=%d,b=%d",a,b);语句。其中,printf是函数名;“a=%d,b=%d”是输出格式控制,决定了输出

数据的内容和格式;a、b称为输出项,是printf函数的实参。

2.printf函数中常用的格式说明

格式控制中,每个格式说明都必须用“%”开头,以一个格式字符作为结束,在此之间可以根据需要插入“宽

度说明”、左对齐符号“-”、前导零符号“0”等。

① 格式字符。主要用于说明输出字符的格式。

② 长度修饰符。在“%”和格式字符之间,可以加入长度修饰符,以保证数据输出格式的正确和对齐。

③ 输出数据所占的宽度说明。当使用%d、%c、%f、%e、%s……的格式说明时,输出数据所占的宽度由系

统决定,通常按照数据本身的实际宽度输出,前后不加空格,并采用右对齐的形式。

④ 输出数据左对齐。输出数据都默认为右对齐,若想左对齐,可以在格式控制中的“%”和宽度之间加一

个“-”号来实现。

⑤ 使输出数据总带“+”和“-”。通常输出的数据如果是负数,前面有 “-”,但正数前面的“+”一般都省

略了。如让每一个数前面都带正负号,可以在“%”和格式字符之间加一个“+”来实现。

31

二级C

考点速记、题解与模拟

3.使用printf函数时的注意事项

① printf的输出格式为自由格式,是否在两个数之间留逗号、空格或回车,完全取决于格式控制。

② 格式控制中必须含有与输出项一一对应的输出格式说明,类型必须匹配,若格式说明与输出项的类型不

一一对应匹配,则不能正确输出,而且编译时不会报错。若格式说明个数少于输出项个数,则多余的输出项不予

输出;若格式说明个数多于输出项个数,则将输出一些毫无意义的数字乱码。

③ 在格式控制中,除了前面要求的输出格式,还可以包括任意的合法字符(包括汉字和转义符),这些字符

输出时将“原样照印”。此外,还可利用n(回车)、r(回行但不回车)、t(制表)、a(响铃)等控制输出格式。

④ 如果要输出“%”,可以在格式控制中用“%%”表示,将输出一个“%”。

⑤ printf函数有返回值,返回值是本次调用输出字符的个数,包括回车等控制符。

真题1 若变量a和b已定义为int类型并赋值21和55,要求用printf函数以a=21,b=55的形式输出,请写出

完整的输出语句_________。【2006.4】

答案:printf("a=%d,b=%d",a,b);

解析:printf函数是C语言提供的标准输出函数,用来在终端设备上按指定格式进行输出。其调用形式如下:

printf(格式控制,输出项1,输出项2,…),格式控制是字符串形式。本题中要按格式输出两个整型变量,所

以格式说明符用“%d”的形式,又要输出“a= ,b= ”的字符形式,所以输出函数printf的完整输出格式说明符

为“a=%d,b=%d”。

真题2 有以下程序段( )。【2008.4】

char ch;int k;

ch='a'; k=12;

printf("%c,%d,",ch,ch,k);

printf("k=%dn",k);

已知字符a的ASCII十进制代码为97,则执行上述程序段后输出结果是

A)因变量类型与格式描述符的类型不匹配输出无定值

B)输出项与格式描述符个数不符,输出为零值或不定值

C)a,97,12k=12

D)a,97,k=12

答案:D)

解析:在用基本输出语句printf时,格式说明与输出项的个数应该相同。如果格式说明的个数少于输出项的

个数(正如本题的情况),多余的输出项不予输出,如果格式说明个数多于输出项个数,则对于多余的格式项输

出不定值或0。故本题选项D)是正确的输出结果。

真题3 若有定义:int k; ,以下程序段的输出结果是_________。【2008.4】

for(k=2;k<6;k++,k++) printf("##%d",k);

答案:##2##4

解析:题中从k=2输出,printf中“%d” 前的内容原样输出,所以第一次输出##2,接着k两次自加为4,

接着输出##4,接着k再两次自加为6,此时不符合循环条件,所以输出结果为“##2##4”。

32

第2章 顺序结构

考点 scanf函数

考点4

scanf函数

4

1.scanf函数的一般调用形式

【功能】scanf函数的一般用于输入数据信息。

【格式】scanf(格式控制,输入项1,输入项2,…)

【说明】在scanf函数调用之后加“;”,则构成输入语句。

2.scanf函数中常用的格式说明

格式控制的主要作用是指定输入时的数据转换格式,即格式转换说明。

每个格式说明都必须用“%”开头,以“格式字符”作为结束。允许用于输入的字符及相应功能见表2-2。

表2-2 格式字符及其说明

格式字符

c

d

i

0

x

u

f(lf)

e(le)

s

输入一个字符

输入带符号的十进制整型数

输入整型数,整型数可以是带先导0的八进制数,也可以是带先导0x(或0X)的十六进制数

以八进制格式输入整型数,可以带先导0,也可以不带

以十六进制格式输入整型数,可以带先导0x或0X,也可以不带

以无符号十进制形式输入整型数

以带小数点的数学形式或指数形式输入浮点数(单精度数用f,双精度数用lf)

以带小数点的数学形式或指数形式输入浮点数(单精度数用f,双精度数用lf)

输入一个字符串,直到遇到’0’。若字符串长度超过指定的精度则自动突破,不会截断字符串

说明

【说明】

z

z

z

z

z

在格式串中,必须含有与输入项一一对应的格式转换说明符。

输入short型整数,格式控制要求用%hd。要输入double型数据,格式控制必须用%lf(或%le)。否则,

数据不能正确输入。

在scanf函数的格式字符前可以加入一个正整数指定输入数据所占的宽度,但不可以用实数指定小数

位的宽度。

由于输入是一个字符流,scanf函数从这个字符流中按照格式控制指定的格式解析出相应数据,送到指

定地址的变量中。

scanf函数有返回值,其值是本次scanf调用正确输入的数据项的个数。

3.通过scanf函数从键盘输入数据

(1)输入数值数据

在输入整数或实数类数值型数据时,输入的数据之间必须用空格、回车符、制表符(Tab键)等间隔符隔开,

33

二级C

考点速记、题解与模拟

间隔符个数不限。即使在格式说明中人为指定了输入宽度,也可以用此方式输入。

(2)指定输入数据所占的宽度

在格式字符前加入一个正整数指定输入数据所占的宽度。

(3)跳过某个输入数据

可以在“%”和格式字符之间加入“*”号,作用是跳过对应的输入数据。

(4)在格式控制字符串中插入其他字符

scanf函数中的格式控制字符串是为了输入数据用的,无论其中有什么字符,也不会输出到屏幕上,因此若

想在屏幕上输出提示信息,应该首先使用printf函数输出。

真题1 有定义语句:int b; char c[10];,则正确的输入语句是( )。【2005.4】

A)scanf("%d%s",&b,&c); B)scanf("%d%s",&b,c);

C)scanf("%d%s",b,c); D)scanf("%d%s",b,&c);

答案:B)

解析:题目的定义语句中,将b定义为整型变量,所以在输入语句中,应在b前加上取地址符&;而c为长

度是10的字符数组,而且c就是字符数组的首地址,所以在输入语句中,c前不用加上取地址符&。

真题2 设有定义: int a; float b;,执行scanf("%2d%f",&a,&b);语句时,若从键盘输入876543.0,a和b

的值分别是( )。【2006.9】

A)876和543.000000 B)87和6.000000

C)87和543.000000 D)76和543.000000

答案:B)

解析:在输入函数scanf的输入格式符%2d%f中,2d表示输入的数据的宽度为2,所以当从键盘输入

876543.0时,这时把输入数字串的前两位87赋给变量a,然后紧接着将6按照格式控制符%f的形式赋给变

量b,所以b的值为6.000000,故本题的答案为选项B)。

真题3 若有说明语句:double *p,a;,则能通过scanf语句正确给输入项读入数据的程序段是( )。【2006.4】

A)*p =&a; scanf("%1f",p);

C)p =&a; scanf("%1f",*p);

答案:D)

解析:double *p,a;语句表示定义了一个指向双精度型的指针变量p 和双精度型变量a,而语句p=&a表示

将变量a的地址赋给指针变量p;scanf("%lf",p)表示用键盘输入的数赋给指针变量p所指向的地址单元中。scanf()

函数要求在输入double型数据时,格式控制符必须用%lf(或%le)。否则,数据不能正确输入。所以选项D)为

正确答案。

真题4 设变量均已正确定义,若要通过scanf("%d%c%d%c",&a1,&c1,&a2,&c2);语句为变量a1和a2赋数值10

和20,为变量c1和c2赋字符X和Y。下面的输入形式中正确的是( )(注:口代表空格字符)。【2007.4】

A)10□X□20□Y

B)10□X20□Y

C)10□X

20Y

34

B)*p =&a; scanf("%f",p);

D)p =&a; scanf("%1f",p);