第8章字符串

第8章字符串
第8章字符串

第十一章字符串

1D

解析:字符串在 C 语言中年干存储时,应该用数组或者是指针进行存储数据。

A 选项中str 为数组,但是后面的赋值的对象中的 '\064'为一个字符,不能构成一个字符串,字符串必须有一个结束符,即: '\0'。故 A 答案是错误的。

B 答案中的str为一个字符变量,变量不能用来存储字符串。故B选项是错误的。C答

案同理。只有 D 答案中符合字符串的定义规则。

2A

解析:A选项中ss[1]可以看作是一个地址常量,其值不能改变,所以不可以对其赋值。但是在定义二维数组的时候,对其进行初始化是允许的,如选项B。选项C中定义的值指针数组,数组中的每一个元素都是指针,所以ss[1]代表的是一个指针,所以指针可以指向一个字符串,即让该指针变量指向该字符串。

选项D中的ss为一个指针数组,所以指针数组中元素都为指针,此时为让该变量指向了“ right?”字符串。

3A

解析:str是地址常量,p是指针变量,两者类型不一致,选项B错误。str数组的长度是20,而p所指的字符串遇到=0'就结束,本题中其长度应该为7,选项C错误。同理,既然str数组的长度与p所指字符串长度不同,所以D答案中的str中的内容为在存储字符串以后的后面为13个‘ \0' p的内容为:7个有效字符。

4C

解析:对于数组p,只有三个元素,分别是’a'b'c:所以sizeof(p)的输出结果应该是3,对于数组q,存储了四个元素,分别是’a','b:'c以及'\0'。所以sizeof (q)的输出结果是4。

5C

解析:对于数组a,只有四个元素,分别是'\'\''以及'\0;所以sizeof(a)的输出结果应该是4,对于数组b,存储了三个元素,分别是‘X;'y','z。。所以sizeof (b)的输出结果是3。所以数组a的长度大于b数组的长度。

6C

解析:数组a中存储了7个字符,分别是'a ; '0 ; '\0 ; '0 ; 'a, '0 ' , '\0 ',当使用sizeof(a)统计计数的时候,会统计计算这7个字符,但是当用strlen (a)统计数组元素个数的时候,遇到 '\0'的时候就会结束,所以最终的输出结果是7 2 。

7B

解析:ps=s语句使ps指向数组s的首地址,即指向元素a,对于表达式*p+4,由于*的优先级高于+,所以进行间接访问运算,*p得到a,再+4,根据ASCII 码的顺序,最后的输出结果应该是e,答案为B。

8B

解析:选项A的getc ()函数完成的是从文件中读入一个字符,而不是题目所要求的从键盘读入一个字符串,错误。选项C的getchar ()函数每次读入的是

一个字符变量,而不是字符串,错误。选项D的scanf ()函数,通过格式控制符%$可以读入字符串变量,但是遇到空格会作为输入数据的分隔符,不会被作

为数据读入。选项B : gets ()函数的功能是从键盘中获得一个字符串,并且在获得字符串的时候可以接受空格字符。

9D

解析:选项A中的参数2的类型应该为指针或者是地址,x[4]为一个数组中的元素,数据类型不匹配,应改为&x[4],选项B中的y是数组名,为常量,不能进行++运算,错误。选项C中参数1对应的数组长度小于参数2的数组长度, 错误。故只有 D 答案的结果正确。

10 B

解析:strlen ()函数统计字符串长度的时候,是在遇到’\0'的时候结束统计。

所以对于数组q来说,定义了数组的长度为10,并给前三个字符赋了初值,则从第4个字符开始,系统将数组元素的值置为’\0:所以strlen(q)的结果是3。而对于数组p 来说,数组长度为3,但是何时遇到 \\0\无法确定,所以strlen(p) 的值也无法确认。

11 D

解析:函数f (char *p[],intn)完成的功能就是对字符串进行字典排序,所谓的字典

顺序就是根据字母的大小顺序,strcmp函数中的功能是:将两个字符串进行比较,比较的原则是从第一个字符开始,如果第一个字符串相同的话,进行第二个字符的比较,一直往后,如果第一个字符不相同的话,直接返回第一个字符减第二个字符的值。在f函数中的语句为两个for循环的嵌套。那么执行过程为:

1) i=0,i<4 真值,执行内循环。\

j=1;j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[1]= ”abc”.j++ 后,j=2; j=2;j<5 真值,执行后的结果为p[0]= ”aabdfg”,p[2]= ”abbc”,j++ 后,j=3; j=3;j<5 真

值,执行后的结果为p[0]= ”aabdfg”,p[3]= ”dcdb6',j++ 后,j=4; j=4; j<5 真

值,执行后的结果为p[0]= ”aabdfg”,p[4]= ”cd”,j++ 后,j=5; j=5; j<5假值。

i++后变量的值为1

2) i=1,i<4 真值,执行内循环。

j=2;j<5 真值,执行后的结果为p[1]= ” abbd”,p[2]= ” abc”,j++ 后,j=3; j=3;j<5 真值,执行后的结果为p[1]= ” abbd”,p[3]= ”dcdbe”,j++ 后,j=4; j=4; j<5 真

值,执行后的结果为p[1]= ” abbc T,p[4]= ”cd”,j++后,j=5; j=5; j<5假值。

i++后变量的值为2

3) i=2,i<4 真值,执行内循环。

j=3;j<5 真值,执行后的结果为p[2]= ” abC,p[3]= ”dcdbe”,j++ 后,j=4; j=4;

j<5 真值,执行后的结果为p[2]= ” abcf,p[4]= ”cd”,j++ 后,j=5; j=5; j<5假

值。i++后变量的值为3

4) i=3, i<4 真值,执行内循环。

j=4; j<5 真值,执行后的结果为p[3]= ” cd”,p[4]= ”dcdbe”,j++ 后,j=5; j=5; j<5 假值。i++ 后变量的值为 4

5) i=4, i<4 假值,退出循环。

最后strlen(p[1])的值为:4。

12 A

解析:*运算符和++运算符的优先级相同,且结合方向都是自右向左,所以在进行

运算时,先计算++的值,再计算*的值,p=s,p指向了字符串中的第一个元素。即

‘ 1'。第一个*p++的计算为:变量p往后指一个位置,即指向了变量

‘ 5'。表达式P++的值为变量原来的值,即指向的还是‘ 1',所以*p++得到的值为‘ 1'。所以最后的输出的结果的1。

第二个表达式的*p++,由于在前面的运算中,p指向了字符变量‘ 5'。

*p++的计算为:变量p往后指一个位置,即指向了变量‘ 9'。表达式p++的值为变量原来的值,即指向的还是‘ 5',所以*p++得到的值为‘ 5'。所以最后的输出的结果的5。

13 D

解析:该题中的while语句中的功能是在a所指的字符串不结束,b所指的字符串不结束,同时两个字符串所指的字符的都相同时,继续往后判断,直到两个字符不相同,或者是其中的一个字符串结束时,退出该循环,所以最后返回的两个所对应位置上的字符的Ascii值,功能和strcmp ()功能是相同的。所以选择答案D。

14 A

解析:point ()函数传递的是指针变量的值,而不是指针变量本身的地址,仍然是一个传值而不是传地址的过程,实参的值没有改变,所以指针p仍然指向

字符串的首地址,输出结果为a。

15 D

解析:比较字符串大小的时候,应该调用函数strcmp(),而不是直接进行比较,选项A错误。对于选项B,只要s1和s2不相等,无论s1所指串是大于或是小于s2所指串,其结果非0 (真值),都会执行语句S,与题意不符,错误。选项 C 的函数实参顺序错误。

16 B

解析:对于二维数组,每一行中含有的元素的个数为:10。第二行的首元素是

接着第一行的最后一个元素的。所以p+10是指向字符串“ Beijing ”字符串的首地址,所以正确答案是B。

17 D

解析:对于格式控制符%s,在输出的时候遇到’\0'才结束输出。即输出的是个字符串。执行循环。

1) p=s+1;p

2) p

3) p

4) p

18 B

解析:gets ()函数需要的参数是指针类型的。所以ACD都满足条件,答案B

中的a[0]是数组中的元素,是一个字符,不是指针类型,错误。

19 A

解析:char *p[4],即定义一个指针数组,数组中的每一个元素都为指针,p[4]指

向的是下标为4的这一个字符串。即:指向的是第5个字符串的首地址,即字

符串“ cd”,所以strle n (p[4])的结果是2。

20 C

解析:数组名是指针常量,不能对其进行整体赋值和整体使用,所以选项C错误,需要注意一点:在定义字符数组的时候可以初始化,如选项A。

2U C

解析:char *s仁”abc”,即定义了一个指针变量si并且si指向的是这个字符串的第一个元素,即指向了字符‘ a'同样的s2指向了字符‘ 1'。swap函数中的语句的功能是交换变量*x和*y两个变量的值,则最后输出的结果为si所指的字符串的内容为:1bc,s2所指的字符串的内容为:a23。

22 B

解析:fun函数统计首字符是’T'的字符串的个数,所以符合条件的有”Tue”

和”Thu”,输出结果为2.

fun函数中的功能为:

1) i=0;i<7;p[i][0]== ''为假值,n=0;i++。变量i 的值为1;

2) i=1;i<7;p[i][0]== 'T'为真值,n=1;i++。变量i 的值为2;

3) i=2;i<7;p[i][0]== 'T'为假值,n=1;i++。变量i 的值为3;

4) i=3;i<7;p[i][0]== 'T'为真值,n=2;i++。变量i 的值为4;

5) i=4;i<7;p[i][0]== 'T'为假值,n=2;i++。变量i 的值为5;

6) i=5;i<7;p[i][0]== 'T'为假值,n=2;i++。变量i 的值为6;

7) i=6;i<7;p[i][0]== 'T'为假值,n=2;i++。变量i 的值为7;

8) i=7;i<7;假值。退出循环。

所以最后输出的是fun (str)即返回的就是n的值,即2.

23 A

解析:fun1函数中的(*q)++将指针q所指向的字符进行一次自加运算,所以输出结果为A.

p=&a[3],即变量p得到的是字符‘ g'的首地址。

(*q)++代表的是,先计算出*q的值,然后计算变量的自加。执行循环:

1) *q!= '\0'为真值,(*q)++得到的结果为h,q++,指向了字符‘ r'

2) *q!= '\0'为真值,(*q)++得到的结果为s,q++,指向了字符‘ a'.

3) *q!= '\0'为真值,(*q)++得到的结果为b,q++,指向了字符‘ m'.

4) *q!= '\0'为真值,(*q)++得到的结果为n,q++,指向了字符‘ \0'.

5) *q!= '\0'为假值,退出循环。

所以最后这个字符串的结果为:Prohsbn

24 C

解析:

1、i=0;i<2 真值

1) j=0;p[i][j]!= '\0',真值,( p[i][j]- ‘ 0') %2即:(‘ 3'-‘0')%2为真值,

num=10*0+3=3;j=j+2=2;

2) j=2; p[i][j]!= '\0',真值,( p[i][j]- ‘0')%2即:(‘9'-‘0')%2为真值,

num=10*3+9=39;j=j+2=5;

3) j=5; p[i][j]!= '\0',假值。退出该循环语句。

2、i=1;i<2 真值

1) j=0;p[i][j]!= '\0',真值,( p[i][j]- ‘0') %2即:(‘ 2'-‘0') %2为假值,

j=j+2=2;

2) j=0;p[i][j]!= '\0',真值,( p[i][j]- ‘0') %2即:(‘ 8'-‘0') %2为假值,

j=j+2=5;

3) j=5; p[i][j]!= '\0',假值。退出该循环语句。

3、i=2;i<2 假值,退出循环语句,最后num 的值为39.

25 A

解析:二维数组在计算机中的存储是连续存储。二维数组str 的第二维数是20,所以p+20保存的是字符串”Beijing”的首地址.strlen(p+20)输出的就是字符

串”Beijing ”的长度。.结果为7。

26 A

解析:while中的语句是(*p2=*p1 ),即将pl所指的字符赋值给p2所指的内容,直到将p1 所指的字符串结束,注意,这是赋值语句,不是比较语句,正确答案为A

27 C

解析:p=s[1]语句使得指针p指向下表为1的字符串“ two”的首地址,所以*

(p+1)的输出结果是“two”的第二个字符‘ w ',而s[0]得到的值为下标为0 的字符串。即:one.

28 B

解析:puts()函数实现的功能是输出字符串,while循环中,ps的值首先保存

第一个字符地址,指向字符‘ x '.执行循环语句:

1) *ps真值,ps++,ps指向了字符‘ y'。

2) *ps真值,ps++,ps指向了字符‘ z'。

3) *ps真值,ps++,ps指向了字符‘ \0'。

4) *ps假值,退出循环。

执行for 语句。

1) ps--即ps指向了字符‘ z'o ps-str>=0。puts(ps);则输出的是乙并且换行。

2) ps--即ps指向了字符‘ y'。ps-str>=0。puts(ps);则输出的是yz,并且换行。

3) ps--即ps指向了字符‘ x'。ps-str>=0。puts(ps);则输出的是xyz,并且换行。

4) ps--即ps指向了字符‘ x'前面。ps-str>=0为假值,退出循环。所以最后的答案为Bo

29 D

解析:strlen (p)遇到‘ \0'结束执行。所以只统计了指针p指向的前5个字符

“ abcde” , 结果为 5 。

30 A

解析:字符串s中的存储字符有下面9个:’’,'1','4','1','\141','a','b','c','\t',所以strlen (s)的结果为9。

31 B

解析:ch[1]看作是二维数组的行指针,指向第二个字符串的首地址,注意输出中的转义字符”输出的结果是显示一个”所以输出的是ch[1]所指的这一个字符串,

即:BBB.printf( “” :c h[1]);的输出结果为:“ BBB ”。所以选择答案B

32 A

解析:字符串常量“ good!”赋给字符串变量时,再结尾自动加上字符’\0',这样就一共需要6个存储单元,但是选项A中的数组str的长度只有5,所以错误。选项B 中,默认的元素的个数为6.选项C中使用的指针来存放字符串。

33 D

解析:pb=b1+3,即让指针指向了字符‘ d'.执行循环语句:

1) --pb>=b1为真值,执行strcpy()函数。即:将pb所指的字符串中的内容复制

到b2所指的存储单元中。b2中存放的内容为:cdefg.

2) --pb>=b1为真值,执行strcpy()函数。即:将pb所指的字符串中的内容复制

到b2所指的存储单元中。b2中存放的内容为:bcdefg.

3) --pb>=b1为真值,执行strcpy()函数。即:将pb所指的字符串中的内容复制

到b2所指的存储单元中。b2中存放的内容为:abcdefg.

4) --pb>=b1的值为假值,退出该语句。最后b2中的内容为:abcdefg。有效

字符个数为:7.

二、填空:

19

解析:strlen是统计出字符串中的有效字符的个数,该字符串中的有效字符的个数分别为:‘ I\、‘M\、‘B\、‘\n\、‘ 0\、‘1\、‘2\、‘\1\、

*2*4*6*8

解析:p=a;即让p指向字符串的第一个字符。执行循环体

1) *p 为真值,i=0;i%2==0 为真值,*p= ‘*\,即第一个字符得到的字符为*。

P++,指向了第下标为1的这一个字符。i++. i=1

2) *p为真值,i=1;i%2==0为假值,P++,指向了第下标为2的这一个字符。i++.

i=2

3) *p 为真值,i=2;i%2==0为真值,*p= ‘',即第一个字符得到的字符为*。

P++,指向了第下标为3的这一个字符。i++. i=3

4) *p 为真值,i=3;i%2==0为假值,P++,指向了第下标为4的这一个字符。i++. i=4

5) *p 为真值, i=4;i%2==0 为真值, *p= ‘*',即第一个字符得到的字符为 *。

P++指向了第下标为5的这一个字符。i++. i=5

6) *p 为真值,i=5;i%2==0为假值,P++,指向了第下标为6的这一个字符。i++. i=6

7) *p 为真值, i=6;i%2==0 为真值, *p= ‘*',即第一个字符得到的字符为 *。

P++指向了第下标为7的这一个字符。i++. i=7

8) *p 为真值,i=7;i%2==0为假值,P++,指向了第下标为8的这一个字符。i++. i=8

9) *p 为真值, i=8;i%2==0 为真值, *p= ‘*',即第一个字符得到的字符为 *。

P++指向了第下标为8的这一个字符。i++. i=9

10) *p 为假值,退出while 循环。

3 *t++

解析:注意*s++的计算方法,首先算是的是s++,即让指针变量往后指一个位 置,再来计算*s++的值,由于算的是表达式的值,所以表达式的值为变量原来 所指的内容,即首先是第一个字符的元素,那么要将 t 所指的字符串中的值赋 值在该存储空间中,即 *t, 但是由于如果指针变量 t 的值不往后指的话,得到的 值就一直都是t 所指的数组中的第一个元素的值,所以t 也要往后指,所以指针 变量t 也要自加,即:t++.所以该处所填写的内容为:*t++.

4 efgh

解析:char *ss(char *s)的功能是返回地址的函数。strlen (s )/2的值为4,所以 指针变量p 的起始地址是从字符’e '的地址开始,格式控制符%s 输出遇到 ‘ \0'结束。所以输出 efgh 。

5 cdeab

解析:执行循环体中的内容

1) i=1;i<=3真值,执行函数体中的内容,temp= e ;执行循环体。

主函数中的i++变为3.执行函数体中的内容。temp= C ;执行循环体

① i=4;i>0 真值,字符串中的内容变为: deabb.i —变为 3.② i=3;i>0 ③ i=2;i>0 ④ i=1;i>0 ⑤ i=0;i>0 主函数中的 ① i=4;i>0 ② i=3;i>0 ③ i=2;i>0 ④ i=1;i>0 ⑤ i=0;i>0

真值,字符串中的内容变为 真值,字符串中的内容变为 真值,字符串中的内容变为 真值,字符串中的内容变为 abcdd.i —变为 3.

abccd.i —变为 2.

abbcd.i —变为 1

aabcd.i —变为 0

假值。退出循环。最后字符串的内容为: eabcd.

i++变为2.执行函数体中的内容。temp= d,执行循环体

真值,字符串中的内容变为 真值,字符串中的内容变为 真值,字符串中的内容变为 真值,字符串中的内容变为 eabcc.i —变为 3.

eabbc.i —变为 2.

eaabc.i —变为 1

eeabc.i —变为 0

假值。退出循环。最后字符串的内容为: deabc. 3) 2) ① i=4;i>0

②i=3;i>0真值,字符串中的内容变为:deaab.i —变为 2.

③i=2;i>0真值,字符串中的内容变为:deeab.i —变为1

④i=1;i>0真值,字符串中的内容变为:ddeab.i —变为0

⑤i=0;i>0假值。退出循环。最后字符串的内容为:ceabc.

4) 主函数中的i++ 变为4.i<=3 为假值。退出循环

6、s[i]>= ‘0'&&s[i]<= '9';判断的函数中的字符串中的字符为数字字符的个数,一个字符是否为数字字符的判断的条件为:s[i]>= ‘0'&&s[i]<= '9'

7 p+n

解析:while语句中的表达式为:p[n]!= c&&p[n]!= '\0'.当表达式的值为假值时退出循环,那么条件为假时,即:p[ n]== c||p[ n]== '\0‘,那么就可以算出表达式的根据字符串的意思,在退出循环的时候,p[ n]为所指的字符的位置,所以指向的返回的值为字符所在的位置,即该位置为:p+n;

8 s-1 *s++

解析:第一个循环语句的功能是将指针t所指的内容复制到s所指的数组中,到循环结束时,t和s都指向了结束符后的一个字符,接着要将t所指的字符串复

制到s所指的后面,即应该从结束符开始赋值,但是此时的s没有指向结束,符,所以最后s=s-1,将s指到结束符的位置。第二空和while语句中的内容一样。

9 *t

解析:n=strle n(s)得到的是字符串的长度。那么(*(s+n))得到的值为字符串的结束符所在的位置,所以要将t所指的字符串中的内容赋值到s的后面,所以填写的内容的是:*t。

10 不用做

11 gae

解析:pl指向的是a字符串的第一个元素,p2指向的是b字符串的第一个元素,for 循环的功能是比较出两个字符串所指的字符中相同的值,并将该字符输出。所以最后的输出的结果为:gae.

12 不用做

13 str+strlen(str)-1 str t==0

判断一个字符串是否回文的判断的规则是:看这一个字符串从左至右和从右至左是否相同即可故用到两个指针变量,让一个变量从字符串的第一个位置开始,另外一个指针变量的从字符串的最后一个字符开始,那么最后一个字符繁荣指针为:

str+strlen(str)-1 并将该指针赋值给变量p2,执行后面的for循环语句,则在这个循环语句中,判断两个指针所指的字符是否相等,如果不相等的话,说明不是回文,那么就将t=1,如果是回文字符的话,最后的t值为0.所以最后空的填写内容为:

t==0.

C语言第8章 字符串

第十一章字符串 1 D 解析:字符串在C语言中年干存储时,应该用数组或者是指针进行存储数据。 A选项中str为数组,但是后面的赋值的对象中的’\064’为一个字符,不能构成一个字符串,字符串必须有一个结束符,即:’\0’。故A答案是错误的。B答案中的str为一个字符变量,变量不能用来存储字符串。故B选项是错误的。C答案同理。只有D答案中符合字符串的定义规则。 2 A 解析:A选项中ss[1]可以看作是一个地址常量,其值不能改变,所以不可以对其赋值。但是在定义二维数组的时候,对其进行初始化是允许的,如选项B。选项C中定义的值指针数组,数组中的每一个元素都是指针,所以ss[1]代表的是一个指针,所以指针可以指向一个字符串,即让该指针变量指向该字符串。选项D中的ss为一个指针数组,所以指针数组中元素都为指针,此时为让该变量指向了“right?”字符串。 3 A 解析:str是地址常量,p是指针变量,两者类型不一致,选项B错误。str 数组的长度是20,而p所指的字符串遇到’\0’就结束,本题中其长度应该为7,选项C错误。同理,既然str数组的长度与p所指字符串长度不同,所以D答案中的str中的内容为在存储字符串以后的后面为13个‘\0’。 p的内容为:7个有效字符。 4 C 解析:对于数组p,只有三个元素,分别是’a’,’b’,’c’,所以sizeof(p)的输出结果应该是3 ,对于数组q,存储了四个元素,分别是’a’,’b’,’c以 及’\0’。所以 sizeof(q)的输出结果是4。 5 C 解析:对于数组a,只有四个元素,分别是’x’,’y’,’z’ 以及’\0’,所以sizeof(a)的输出结果应该是4,对于数组b,存储了三个元素,分别 是’x’,’y’,’z’。所以 sizeof(b)的输出结果是3。所以数组a 的长度大于b 数组的长度。 6 C 解析:数组a中存储了7个字符,分别是’a’,’0’,’\0’,’0’,’a’,’0’,’\0’,当使用sizeof(a)统计计数的时候,会统计计算这7个字符,但是当用strlen(a)统计数组元素个数的时候,遇到’\0’的时候就会结束,所以最终的输出结果是7 2 。

第八章 习题答案

8.2 阅读程序,指出程序的输出结果。 (1) #include void main() { char *p ="Student "; void prn_str(char *, int, int); prn_str(p, 6, 4); } void prn_str(char *str, int m, int n) { int i; for (i =1; i <=m -n; i ++) printf(" "); for (i =1; i <=n; i ++) printf("%c ", *str ++); printf("\n "); } (2) #include void main() { int a[3][4]={1, 2, 3, 4, 3, 4, 5, 6, 5, 6, 7, 8}; int i, j, *p =*a; for (i =0; i <3; i ++) { for (j =0; j <4; j ++) printf("%3d ", *p ++); printf("\n "); } } (2) #include void main() { char a[]="Chang "; char *p =a; while (*p) printf("%s\n ", p ++); } 8.3 程序填空。 (1) 以下函数用于求出一个3?4矩阵中的最大元素值。 #include int maxvalue(int (*p)[4]) { int i, j, max; max =①; for (i =0; ②; i ++) { for (j =0; ③; j ++) if (④>max) max =⑤; p ++; } return max;

第八章 文 件

第八章文件 一、单项选择题 1.C语言中,文件由(A)。 A.字符(字节)序列组成B.记录组成 C.数据行组成D.数据块组成 2.若文件型指针fp中指向某文件的末尾,则函数feof(fp)的返回值是(C)。 A.0 B.-1 C.非零值D.NULL 3. 下列语句将输出(B) #include printf(“%d %d %d”, NULL,’\0’,EOF); A. 0 0 1 B. 0 0 –1 C. NULL EOF D. 1 0 EOF 4.下列语句中,将fp定义为文件型指针的是(B)。 A.FILE fp; B.FILE *fp;C.file fp; D.file *fp; 5. 定义FILE *fp; 则文件指针fp指向的是(D)。 A. 文件在磁盘上的读写位置 B. 文件在缓冲区上的读写位置 C. 整个磁盘文件 D. 文件类型结构体 6. 缓冲文件系统的缓冲区位于(C )。 A. 磁盘缓冲区中 B. 磁盘文件中 C. 内存数据区中 D. 程序中 7. 以“只读”方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的( D)。 A、fp=fopen(”a:\aa.dat”,”ab”); B、fp=fopen(”a:\aa.dat”,”a”); C、fp=fopen(”a:\aa.dat”,”wb”); D、fp=fopen(”a:\aa.dat”,”r”); 8. 以“追加”方式打开文本文件a:\aa.dat,下列语句中哪一个是正确的( B)。 A、fp=fopen(”a:\aa.dat”,”ab”); B、fp=fopen(”a:\aa.dat”,”a”); C、fp=fopen(”a:\aa.dat”,”r+”); D、fp=fopen(”a:\aa.dat”,”w”); 9. 如果二进制文件a.dat已存在,现要求写入全新的数据,应以什么方式打开(A)。 A. “w” B. “wb” C. “w+” D. “wb+” 10. 为读写建立一个新的文本文件a:\aa.dat,下列语句中哪一个是正确的( B)。 A、fp=fopen(”a:\aa.dat”,”ab”); B、fp=fopen(”a:\aa.dat”,”w+”); C、fp=fopen(”a:\aa.dat”,”wb”); D、fp=fopen(”a:\aa.dat”,”rb+”); 11.以读写方式打开一个已有的二进制文件filel,并且定义FILE *fp,下面fopen函数正确 的调用方式是(B )。 A.fp=fopen (“file1”, ”r”) B.fp=fopen (“file1”, ”rb+”) C.fp=fopen (“file1”, ”rb”) D.fp=fopen (“file1”, ”w b+”) 12.标准库函数fputs (p1,p2)的功能是(C)。 A.从p1指向的文件中读一个字符串存入p2指向的内存 B.从p2指向的文件中读一个字符串存入p1指向的内存 C.从p1指向的内存中读一个字符串写到p2指向的文件中 D.从p2指向的内存中读一个字符串写到p1指向的文件中

编译原理 第八章符号表

第八章符号表 编译过程中编译程序需要不断汇集和反复查证出现在源程序中各种名字的属性和特征等有关信息。这些信息通常记录在一张或几张符号表中。符号表的每一项包含两部分,一部分是名字(标识符),另一部分是此名字的有关信息。每个名字的有关信息一般指种属(如简单变量、数组、过程等)、类型(如整、实、布尔等)等等。这些信息将使用于语义检查、产生中间代码以及最终生成目标代码等不同阶段。 编译过程中,每当扫描器识别出一个单词后,编译程序就查阅符号表,看它是否已在其中。如果它是一个新名就将它填进表里。它的有关信息将在词法分析和语法-语义分析过程中陆续填入。 符号表中所登记的信息在编译的不同阶段都要用到。在语义分析中,符号表所登记的内容将用于语义检查(如检查一个名字的使用和原先的说明是否相一致)和产生中间代码。在目标代码生成阶段,当对符号名进行地址分配时,符号表是地址分配的依据。对于一个多遍扫描的编译程序,不同遍所用的符号表也往往各有不同。因为每遍所关心的信息各有差异。 本章重点:符号表的一般组织和使用方法。 第一节符号表的组织和使用 信息栏通常包含许多子栏和标志位,用来记录相应名字的种种不同属性。由于查填符号表一般都是通过匹配名字来实现的,因此,名字栏也称主栏。主栏的内容称为关键字(key word)。 虽然原则上说,使用一张统一的符号表也就够了,但是,许多编译程序按名字的不同种属分别使用许多符号表,如常数表、变量名表、过程名表等等。这是因为,不同种属名字的相应信息往往不同,并且信息栏的长度也各有差异的缘故。因而,按不同种属建立不同的符号表在处理上常常是比较方便的。 对于编译程序的符号表来说,它所涉及的基本操作大致可归纳为五类: 1、对给定名字,确定此名是否在有中; 2、填入新名; 3、对给定名字,访问它的有关信息; 4、对给字名字,填写或更新它的某些信息; 5、删除一个或一组无用的项。 不同种类的表格所涉及的操作往往也是不同的。上述五方面只是一些基本的共同操作。 符号表最简单的组织方式是让各项各栏所占的存储单元的长度都是固定的。这种项栏长度固定的表格易于组织、填写和查找。对于这种表格,每一栏的内容可直接填写在有关的区段里。例如,有些语言规定标识符的长度不得超过8个字符,于是,我们就可以用两个机器字作为主栏(假定每个机器字可容四个字符)每个名字直接填写在主栏中。若标识长度不到8个字符,则用空白符补足。这种直接填写式的表格形式如下: 但是,有许多语言对标识符的长度几乎不加限制,或者说,标识符的长度范围甚宽。譬如说,

第八章 判断题-字符串

第八章判断题 1.用= =比较字符串对象时,如果字符串包含的是同一个值时,结果为true。() 2.字符串在创建后可以被修改。() 3.String类的charAt方法返回字符穿串中字符的个数。() 4.String类的compareTo方法在所比较的字符串相等时返回0。() 5.运算符“==”用于比较引用时,如果两个引用指向内存中同一个对象,则返回true。() 6.StringBuffer类的indexOf方法在字符串中定位某个字符或子串第一次出现的位置。() 7.String类的substring方法拷贝并返回字符串对象的一部分。() 8.String类的replace方法只返回一个新的字符串对象。() 9.String类的valueOf方法由它的参数转换成的字符串。() 10.StringTokenizer类的hasMoreTokens方法确定在字符串中是否还有语言符号返回。() 第八章选择题 1.下面语句书写错误的是: A.String s = “Gone with the wind”; String t = “good”; String k = s + t; B.Stri ng s = “Gone with the wind”; String t; t = s[3] + “one”; C.String s = “Gone with the wind”; String standard = s.toUpperCase( ); D.String s = “home directory”; String t = s - “directory”; 2.请看下面的代码 String s = “hello”; String t = “hello”; String c[ ] = {…h?,?e?,?l?,?l?,?o?}; 下面哪一选项的语句返回值为真: A.s .equals(t); B.t .equals(c); C.s==t; D.t .equals(new String(“hello”)); E. t==c; 3.请看下面的代码 String s = “story”; 下面选项语句书写正确的是: A.s += “books”; B.char c = s[1]; C.int len = s .length; D.String t = s.toLowerCase( ); 4.请看下面的代码 1.class Example { 2. String str;

第8章字符串

第十一章字符串 1D 解析:字符串在 C 语言中年干存储时,应该用数组或者是指针进行存储数据。 A 选项中str 为数组,但是后面的赋值的对象中的 '\064'为一个字符,不能构成一个字符串,字符串必须有一个结束符,即: '\0'。故 A 答案是错误的。 B 答案中的str为一个字符变量,变量不能用来存储字符串。故B选项是错误的。C答 案同理。只有 D 答案中符合字符串的定义规则。 2A 解析:A选项中ss[1]可以看作是一个地址常量,其值不能改变,所以不可以对其赋值。但是在定义二维数组的时候,对其进行初始化是允许的,如选项B。选项C中定义的值指针数组,数组中的每一个元素都是指针,所以ss[1]代表的是一个指针,所以指针可以指向一个字符串,即让该指针变量指向该字符串。 选项D中的ss为一个指针数组,所以指针数组中元素都为指针,此时为让该变量指向了“ right?”字符串。 3A 解析:str是地址常量,p是指针变量,两者类型不一致,选项B错误。str数组的长度是20,而p所指的字符串遇到=0'就结束,本题中其长度应该为7,选项C错误。同理,既然str数组的长度与p所指字符串长度不同,所以D答案中的str中的内容为在存储字符串以后的后面为13个‘ \0' p的内容为:7个有效字符。 4C 解析:对于数组p,只有三个元素,分别是’a'b'c:所以sizeof(p)的输出结果应该是3,对于数组q,存储了四个元素,分别是’a','b:'c以及'\0'。所以sizeof (q)的输出结果是4。 5C 解析:对于数组a,只有四个元素,分别是'\'\''以及'\0;所以sizeof(a)的输出结果应该是4,对于数组b,存储了三个元素,分别是‘X;'y','z。。所以sizeof (b)的输出结果是3。所以数组a的长度大于b数组的长度。 6C 解析:数组a中存储了7个字符,分别是'a ; '0 ; '\0 ; '0 ; 'a, '0 ' , '\0 ',当使用sizeof(a)统计计数的时候,会统计计算这7个字符,但是当用strlen (a)统计数组元素个数的时候,遇到 '\0'的时候就会结束,所以最终的输出结果是7 2 。 7B 解析:ps=s语句使ps指向数组s的首地址,即指向元素a,对于表达式*p+4,由于*的优先级高于+,所以进行间接访问运算,*p得到a,再+4,根据ASCII 码的顺序,最后的输出结果应该是e,答案为B。 8B 解析:选项A的getc ()函数完成的是从文件中读入一个字符,而不是题目所要求的从键盘读入一个字符串,错误。选项C的getchar ()函数每次读入的是 一个字符变量,而不是字符串,错误。选项D的scanf ()函数,通过格式控制符%$可以读入字符串变量,但是遇到空格会作为输入数据的分隔符,不会被作

第八章 N完全问题

第八章 NP-完全问题 §1 关于问题及算法的描述 为了应用算法复杂性理论,首先要对问题、问题的一般描述、计算模型、算法、算法的复杂性给出严格的定义。但在给出精确定义之前,我们先回顾一下有关概念的粗略解释。 所谓一个问题(problem)是指一个有待回答、通常含有几个取值还未确定的自由变量的一个一般性提问(question)。它由两部分构成:一是对其关于参数的一般性描述;二是对该问题的答案所应满足的某些特性的说明。而一个问题的某个实例则可通过指定问题中所有参数的具体取值来得到。以下用∏表示某个问题,用I 表示其实例。 旅行商问题的参数是由所需访问城市的一个有限集合},,,{11m C C C C Λ=和C 中每对城市j i C C ,之间的距离),(j i C C d 所组成。它的一个解是对所给城市的一个排序 (1)(2)(),,,m C C C πππL 使得该排序极小化下面表达式(目标函数)的值 ),(),()1()()1(1 1)(ππππC C d C C d m i m i i ++-=∑ 旅行商问题的一个实例是通过指定城市的数目,并指定每两个城市之间的具体距离而得到的。例如: {}4321,,,C C C C C =,3),(,9),(,6),(, 9),(,5),(,10),(434232413121======C C d C C d C C d C C d C C d C C d 就是旅行商问题的一个实例,这个实例的一个最优解是排序1342,,,C C C C ,因为四个城市的这个排序所对应旅行路线是所有可能环游路线中长度最小的,其长度为27。 目前广泛采用的描述问题的方法主要有两种:一是将任一问题转化为所谓的可行性检验问题(feasibility problem);二是把问题转化为判定问题(decision problem)。实际中几乎所有问题都可直接或间接地转述为判定问题。 判定问题是答案只有“是”与“非”两种可能的问题。一个判定问题∏可简单地由其所有例子的集合∏D 与答案为“是”的例子所构成的子集∏∏?D Y 来刻画。不过,为了反映实际问题所具有的特性,通常所采用的描述方法由两部分组

第八章 指针习题

第八章指针 一、选择题 1.变量的指针,其含义是指该变量的。(0级) A)值B)地址C)名D)一个标志 2.设有说明int (﹡ptr)[M];其中ptr是。(0级) A)M个指向整型变量的指针 B)指向M个整型变量的函数指针 C)一个指向具有M 个整型元素的一维数组的指针 D)具有M个指针元素的一维指针数组,每个元素都只能指向整型量 3.选择出i的正确结果。(1级) int i; char ﹡s=〞a\045+045\ˊb〞; for ( i=0;s++;i++); A)5 B)8 C)11 D)12 4.如下程序的执行结果是。(1级) # include main( ) {int i; char ﹡s=〞a\\\\\n 〞; for( i=0; s[i]!=?\0?;i++) printf(〞%c 〞,﹡ (s+i)); } A)a B)a\ C)a\\ D)a\\\\ 5.如下程序的执行结果是。(2级) # include main() { static int a[ ]={1,2,3,4,5,6}; int ﹡p; p=a; ﹡(p+3)+=2; printf(〞%d,%d\n 〞,﹡p,﹡(p+3)); } A)1,3 B)1,6 C)3,6 D)1,4 6.如下程序的执行结果是。(2级) # include main( ) { static int a[ ][4]={1,3,5,7,9,11,13,15,17,19,21,23}; int (﹡p)[4], i=1,j=2; p=a; printf(〞%d \n 〞, ﹡(﹡(p+i)+j)); } A)9 B)11 C)13 D)17 7.若有以下定义,则对a数组元素的正确引用是。(1级) int a[5], ﹡p=a; A)﹡&a[5] B)a+2 C)﹡(p+5) D)﹡(a+2) 8.若有以下定义,则对a数组元素地址的正确引用是。(1级) int a[5], ﹡p=a; A)p+5 B)﹡a+1 C)&a+1 D)&a[0] 9.若有定义:int a[2][3];则对a数组的第i行第j列(假设i,j已正确说明并赋值)元素值的正确引用为。(1级) A)﹡(﹡(a +i) +j ) B)(a+i) [j] C)﹡(a+i+j) D)﹡(a +i)+j 10.若有定义:int a[2][3];则对a数组的第i行第j列(假设i,j已正确说明并赋值)元素地址的正确引用为。(1级) A)﹡(a [i] +j ) B)(a+i) C)﹡(a+j) D)a[i]+j 11.设有下面的程序段:char s[ ]= 〞china 〞; char ﹡p; p=s;

相关主题
相关文档
最新文档