yahoo在线笔试题(c语言)及部分答案

来源:互联网 发布:学历歧视 知乎 编辑:程序博客网 时间:2024/04/28 19:00

http://kb.cnblogs.com/kb/51739/

类型:C试题 | 试题:55道试题(50道选择题,5道问答题)
注意: 答题过程如果您不提交答案,或者关闭浏览器退出,我们将不再允许您再次答题。谢谢!
试题 选项
Question 1. (单选)
在顺序表(3,6,8,10,12,15,16,18,21,25,30)中,用二分法查找关键码值11,所需的关键码比
较次数为(3)

1. 2
2. 3
3. 4
4. 5

Question 2. (单选)
设散列表的存储空间大小为19,所用散列函数为h(key)=key mod 19,用开地址线性探查法解
决碰撞。散列表的当前

状态如下:0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 190 194 768 559 582 39
3 208.现要将关键码

值75插入到该散列表中,其地址应为 (1)

1. 1
2. 11
3. 5
4. 15

Question 3. (单选)
作业管理的主要任务包括作业输入、作业处理和作业输出。其中作业处理的工作是Ⅰ.作业
调度 Ⅱ.作业控制 Ⅲ.

作业后备 (3)

1. 只有Ⅰ
2. 只有Ⅱ
3. Ⅰ和Ⅱ
4. 都是

Question 4. (单选)
系统为了管理文件,设置了专门的数据结构----文件控制块(FC。FCB是在执行下列哪一个系
统调用时建立的? (1)

1. create
2. open
3. read
4. write

Question 5. (单选)
下面关于通道的叙述中,正确的是Ⅰ.通道相当于一个功能简单的处理机Ⅱ.通道完成数据输
入输出工作Ⅲ.通道与

CPU共用一个内存 (4)

1. Ⅰ和Ⅱ
2. Ⅰ和Ⅲ
3. Ⅱ和Ⅲ
4. 都是

Question 6. (单选)
互操作性是指在不同环境下的应用程序可以相互操作,交换信息。要使采用不同数据格式的
各种计算机之间能够相

互理解,这一功能是由下面哪一层来实现的? (2)

1. 应用层
2. 表示层
3. 会话层
4. 传输层

Question 7. (单选)
在UNIX的Shell程序中,可以使用位置变量。若要指明Shell引用的最近后台进程的号码,可
以使用位置变量 (2)

1. $$
2. $!
3. $#
4. $-

Question 8. (单选)
设二叉树根结点的层次为0,一棵深度(高度)为k的满二叉树和同样深度的完全二叉树各有
f个结点和c个结点,下列

关系式不正确的是: (2)

1. f>=c
2. c>f
3. f=2k+1-1
4. C>2k-1

Question 9. (单选)
单链表的每个结点中包括一个指针link,它指向该结点的后继结点。现要将指针q指向的新
结点插入到指针p指向的

单链表结点之后,下面的操作序列中哪一个是正确的? (3)

1. q:=p^.link; p^.link:=q^.link
2. p^.link:=q^.link; q:=P^.link
3. q^.link:=p^.link; p^.link:=q;
4. p^.link:=q; q^.link:=p^,link

Question 10. (单选)
某二叉树结点的对称序序列为A、B、C、D、E、F、G,后序序列为B、D、C、A、F、G、E。
该二叉树结点的前序序

列为 (2)

1. E、G、F、A、C、D、B
2. E、A、C、B、D、G、F
3. E、A、G、C、F、B、D
4. E、G、A、C、D、F、B

Question 11. (单选)
某二叉树结点的对称序序列为A、B、C、D、E、F、G,后序序列为B、D、C、A、F、G、E。
该二叉树对应的树林包

括多少棵树? (2)

1. 1
2. 2
3. 3
4. 4

Question 12. (单选)
某二叉树结点的对称序序列为A、B、C、D、E、F、G,后序序列为B、D、C、A、F、G、E。
该二叉树对应的树林结

点的层次次序序列为 (1)

1. E、G、F、A、C、D、B
2. E、A、C、B、D、G、F
3. E、A、G、C、F、B、D
4. E、G、A、C、D、F、B

Question 13. (单选)
假设就绪队列中有10个进程,系统将时间片设为200ms, CPU进行进程切换要花费10ms。则
系统开销所占的比率约

为 (2)

1. 1%
2. 5%
3. 10%
4. 20%

yahoo在线笔试题(c语言)及部分答案
Question 14. (单选)
长度相同但格式不同的2种浮点数,假设前者阶码长、尾数短,后者阶码短、尾数长,其它
规定均相同,则它们可

表示的数的范围和精度为: (2)

1. 两者可表示的数的范围和精度相同
2. 前者可表示的数的范围大但精度低
3. 后者可表示的数的范围大且精度高
4. 前者可表示的数的范围大且精度高

Question 15. (单选)
所谓“变号操作”是指将一个整数变成绝对值相同但符号相反的另一个整数。假设使用补
码表示的8位整数

X=10010101,则经过变号操作后结果为:(4)

1. 1101010
2. 10101
3. 11101010
4. 1101011

Question 16. (单选)
设有一个用数组Q[1..m」表示的环形队列,约定f为当前队头元素在数组中的位置,r为队
尾元素的后一位置(按顺

时针方向),若队列非空,则计算队列中元素个数的公式应为:(2)

1. r-f
2. (m+r-f) mod m
3. (m-r+f)mod m
4. (m-r-f) mod m

Question 17. (单选)
计算机最主要的工作特点是(2)

1. 存储程序与自动控制
2. 高速度与高精度
3. 可靠性与可用性
4. 有记忆能力

Question 18. (单选)
计算机中数据的表示形式是(3)

1. 八进制
2. 十进制
3. 二进制
4. 十六进制

Question 19. (单选)
下面列出的四种存储器中,易失性存储器是(1)

1. RAM
2. ROM
3. PROM
4. CD-ROM

Question 20. (单选)
I/O接口位于 (2)

1. 总线和设备之间
2. CPU和I/O设备之间
3. 主机和总线之间
4. CPU和主存储器之间

Question 21. (单选)
计算机硬件能直接识别和执行的只有(4)

1. 高级语言
2. 符号语言
3. 汇编语言
4. 机器语言

Question 22. (单选)
具有多媒体功能的微型计算机系统中,常用的CD-ROM是(2)

1. 只读型大容量软盘
2. 只读型光盘
3. 只读型硬盘
4. 半导体只读存储器

Question 23. (单选)
微机中1K字节表示的二进制位数是(4)

1. 1000
2. 8x1000
3. 1024
4. 8x1024

Question 24. (单选)
下列字符中,ASCII码值最小的是(2)

1. a
2. A
3. x
4. Y

Question 25. (单选)
OSI(开放系统互联)参考模型的最低层是(3)

1. 传输层
2. 网络层
3. 物理层
4. 应用层

Question 26. (单选)
在面向对象的系统中,系统责任的良好分配原则是(3)

1. 在类之间均匀分配
2. 集中分配在少数控制类中
3. 根据交互图的消息进行分配
4. 根据个人喜好进行分配

yahoo在线笔试题(c语言)及部分答案
Question 27. (单选)
在CMM模型中,对软件成熟度有以下5个级别,请从低到高排序
a 初始级:
软件过程的特点是无秩序的,偶尔甚至是混乱的。几乎没有什么过程是经过定义的,成功依
赖于个人的努力。

b 优化级:
利用来自过程和来自新思想、新技术的先导性试验的定量反馈信息,使持续过程改进成为
可能。

c 已定义级:
管理活动和工程活动两方面的软件过程均已文档化、标准化、并集成到组织的标准软件过
程。

d 已管理级:
已采集详细的有关软件过程和产品质量的度量,无论软件过程还是产品均得到定量了解和控
制。

e 可重复级:
已建立基本的项目管理过程去跟踪成本、进度和功能性。必要的过程纪律已经就位,使具
有类似应用的项目。能重

复以前的成功。
(3)

1. acdbe
2. adceb
3. aecdb
4. abcde

Question 28. (单选)
在下面所列举的逻辑测试覆盖中,测试覆盖最强的是(3)

1. 条件覆盖
2. 条件组合覆盖
3. 语句覆盖
4. 条件及判定覆盖

Question 29. (单选)
一般来说,在软件维护过程中,大部分工作是由什么引起的(3)

1. 适应新的软件环境
2. 适应新的硬件环境
3. 用户的需求改变
4. 程序的可靠性

Question 30. (单选)(2)
PSP是?

1. 团队软件过程
2. 个体软件过程
3. 过程改进过程
4. 质量管理过程

Question 31. (单选)
假定a和b为int型变量,则执行以下语句后b的值为 (4)
a=1; b=10;
do { b-=a; a++; } while (b--<0);

1. 9
2. -2
3. -1
4. 8

Question 32. (单选)
设有以下宏定义:
#define N 3
#define Y(n) ( (N+1)*n)
则执行语句:z=2 * (N+Y(5+1));后,z的值为 (3)

1. 出错
2. 42
3. 48
4. 54

Question 33. (单选)
执行以下程序段后,m的值为 (1)
int a[2][3]={ {1,2,3},{4,5,6} };
int m,*p;
p=&a[0][0];
m=(*p)*(*(p+2))*(*(p+4));

1. 15
2. 14
3. 13
4. 12

Question 34. (单选)
有以下程序
main()
{ char a[]=\"programming\", b[]=\"language\";
char *p1,*p2;
int i;
p1=a; p2=b;
for(i=0;i<7;i++)
if(*(p1+i)==*(p2+i)) printf(\"%c\",*(p1+i));
}
输出结果是 (4)

1. gm
2. rg
3. or
4. ga

Question 35. (单选)
有以下程序
int fun(int x,int y,int *cp,int *dp)
{ *cp=x+y; *dp=x-y; }
main()
{ int a, b, c, d;
a=30; b=50;
fun(a,b,&c,&d);
printf(\"%d,%d
\", c, d);
}
输出结果是 (3)

1. 50,30
2. 30,50
3. 80,-20
4. 80,20

Question 36. (单选)
下述标识符中, 合法的用户标识符是(4)

1. A#C
2. getch
3. void
4. sizeOf

yahoo在线笔试题(c语言)及部分答案
Question 37. (单选)
以下选项中合法的字符常量是(3)

1. A
2. \'10\'
3. 68
4. D

Question 38. (单选)
以下叙述正确的是 (3)

1. 在C程序中,main函数必须位于程序的最前面
2. C程序的每行中只能写一条语句
3. C语言本身没有输入输出语句
4. 在对一个C程序进行编译的过程中,可发现注释中的拼写错误

Question 39. (单选)
以下叙述中不正确的是 (4)

1. 在不同的函数中可以使用相同名字的变量
2. 函数中的形式参数是局部变量
3. 在一个函数内定义的变量只在本函数范围内有效
4. 在一个函数内的复合语句中定义的变量在本函数范围内有效

Question 40. (单选)
设int类型的数据长度为2个字节,则 unsigned int 类型数据的取值范围是 (2)

1. 0~255
2. 0~65535
3. -32768~32767
4. -256~255

Question 41. (单选)
某文件中定义的静态全局变量(或称静态外部变量)其作用域是 (2)

1. 只限某个函数
2. 本文件
3. 跨文件
4. 不限制作用域

Question 42. (单选)
语句:printf(\"%d
\",12 & 012);的输出结果是 (3)

1. 12
2. 012
3. 8
4. 6

Question 43. (单选)
设int x=4; 则执行以下语句: x+=x-=x-x;后,x的值为 (3)

1. 0
2. 4
3. 8
4. 12

Question 44. (单选)
while(!x)中的(!x)与下面条件等价。 (4)

1. x==1
2. x!=1
3. x!=0
4. x==0

Question 45. (单选)
已知int i,a;执行语句: i=(a=2*3,a*5),a+6;后,变量i的值是 (3)

1. 6
2. 12
3. 30
4. 36
Question 46. (单选)
整型变量x和y的值相等、且为非0值,则以下选项中,结果为零的表达式是 (4)

1. x || y
2. x | y
3. x & y
4. x ^ y

Question 47. (单选)
x、y、z被定义为int型变量,若从键盘给x、y、z输入数据,正确的输入语句是 (2)

1. INPUT x、y、z;
2. scanf(\"%d%d%d\",&x,&y,&z);
3. scanf(\"%d%d%d\",x,y,z);
4. read(\"%d%d%d\",x,y,z);

Question 48. (单选)
以下各选项企图说明一种新的类型名,其中正确的是 (2)

1. typedef v1 int;
2. typedef int v3;
3. typedef v4: int;
4. typedef v2=int;

Question 49. (单选)
char x=3,y=6,z;
z=x^y<<2;
则z的二进制值是 (2)

1. 10100
2. 11011
3. 11100
4. 11000

Question 50. (单选)
若有说明:int i, j=2,*p=&i;,则能完成i=j赋值功能的语句是 (2)

1. i=*p;
2. *p=*&j;
3. i=&j;
4. i=**p;
Question 51. (问答)
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a的bit 3。在以上两
个操作中,要保持其它

位不变。

a|=0x4;

int b=a&0x7;
a>>=4;
a=(a<<4)|b;

Question 52. (问答)
有双向循环链表结点定义为:
struct node
{ int data;
struct node *front,*next;
};
有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中dat
a值相同的结点删除

struct node{ int data;struct node *front,*next;};node* del(node *pHead){if(pHead==pHead->next){free(pHead);return NULL;}node *p=pHead;pHead->next->front=pHead->front;pHead->front

给定字符串A和B,输出A和B中的最大公共子串。比如A="aocdfe" B="pmcdfa" 则输出"cdf"

 

*///Author: azhen#include<stdio.h>#include<stdlib.h>#include<string.h>char *commanstring(char shortstring[], char longstring[]){int i, j;char *substring=malloc(256);if(strstr(longstring, shortstring)!=NULL) //如果……,那么返回shortstringreturn shortstring; for(i=strlen(shortstring)-1;i>0; i--) //否则,开始循环计算{for(j=0; j<=strlen(shortstring)-i; j++){memcpy(substring, &shortstring[j], i);substring[i]='\0';if(strstr(longstring, substring)!=NULL)return substring;}}return NULL;}main(){char *str1=malloc(256);char *str2=malloc(256);char *comman=NULL;gets(str1);gets(str2);if(strlen(str1)>strlen(str2)) //将短的字符串放前面comman=commanstring(str2, str1);elsecomman=commanstring(str1, str2);printf("the longest comman string is: %s\n", comman);}

11.写一个函数比较两个字符串str1和str2的大小,若相等返回0,若str1大于str2返回1,若str1小于str2返回-1

int strcmp ( const char * src,const char * dst){int ret = 0 ;while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst){++src;++dst;}if ( ret < 0 )ret = -1 ;else if ( ret > 0 )ret = 1 ;return( ret );}

3,求1000!的未尾有几个0(用素数相乘的方法来做,如72=2*2*2*3*3);求出1->1000里,能被5整除的数的个数n1,能被25整除的数的个数n2,能被125整除的数的个数n3,能被625整除的数的个数n4.1000!末尾的零的个数=n1+n2+n3+n4;

#include<stdio.h>#define NUM 1000int find5(int num){int ret=0;while(num%5==0){num/=5;ret++;}return ret;}int main(){int result=0;int i;for(i=5;i<=NUM;i+=5){result+=find5(i);}printf(" the total zero number is %d\n",result);return 0;}

1. 有双向循环链表结点定义为:

 

struct node { int data; struct node *front,*next; }; 

有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除

 

BOOL DeteleNode(Node *pHeader, DataType Value){if (pHeader == NULL) return;BOOL bRet = FALSE;Node *pNode = pHead;while (pNode != NULL){if (pNode->data == Value){if (pNode->front == NULL){pHeader = pNode->next;pHeader->front = NULL;}else{if (pNode->next != NULL){pNode->next->front = pNode->front;}pNode->front->next = pNode->next;}Node *pNextNode = pNode->next;delete pNode;pNode = pNextNode;bRet = TRUE; //不要break或return, 删除所有}else{pNode = pNode->next;}}return bRet;}void DE(Node *pHeadA, Node *pHeadB){if (pHeadA == NULL || pHeadB == NULL){return;}Node *pNode = pHeadA;while (pNode != NULL){if (DeteleNode(pHeadB, pNode->data)){if (pNode->front == NULL){pHeadA = pNode->next;pHeadA->front = NULL;}else{pNode->front->next = pNode->next;if (pNode->next != NULL){pNode->next->front = pNode->front;}}Node *pNextNode = pNode->next;delete pNode;pNode = pNextNode;}else{pNode = pNode->next;}}}

2. 编程实现:找出两个字符串中最大公共子字符串,如"abccade","dgcadde"的最大子串为"cad"

int GetCommon(char *s1, char *s2, char **r1, char **r2){int len1 = strlen(s1);int len2 = strlen(s2);int maxlen = 0;for(int i = 0; i < len1; i++){for(int j = 0; j < len2; j++){if(s1[i] == s2[j]){int as = i, bs = j, count = 1;while(as + 1 < len1 && bs + 1 < len2 && s1[++as] == s2[++bs])count++;if(count > maxlen){maxlen = count;*r1 = s1 + i;*r2 = s2 + j;}}}}

3. 编程实现:把十进制数(long型)分别以二进制和十六进制形式输出,不能使用printf系列库函数

 

char* test3(long num) {char* buffer = (char*)malloc(11);buffer[0] = '0';buffer[1] = 'x';buffer[10] = '\0';char* temp = buffer + 2;for (int i=0; i < 8; i++) {temp[i] = (char)(num<<4*i>>28);temp[i] = temp[i] >= 0 ? temp[i] : temp[i] + 16;temp[i] = temp[i] < 10 ? temp[i] + 48 : temp[i] + 55;}return buffer;}

4.输入N, 打印 N*N 矩阵
比如 N = 3,打印:
1 2 3
8 9 4
7 6 5

N = 4,打印:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
解答:

1、

#define N 15int s[N][N];void main(){int k = 0, i = 0, j = 0;int a = 1; for( ; k < (N+1)/2; k++ ){while( j < N-k ) s[i][j++] = a++; i++; j--;while( i < N-k ) s[i++][j] = a++; i--; j--;while( j > k-1 ) s[i][j--] = a++; i--; j++;while( i > k ) s[i--][j] = a++; i++; j++; }for( i = 0; i < N; i++ ){for( j = 0; j < N; j++ )cout << s[i][j] << '\t';cout << endl;}}

2、

define MAX_N 100int matrix[MAX_N][MAX_N];/**(x,y):第一个元素的坐标* start:第一个元素的值* n:矩阵的大小*/void SetMatrix(int x, int y, int start, int n) {int i, j;if (n <= 0) //递归结束条件return;if (n == 1) { //矩阵大小为1时matrix[x][y] = start;return;}for (i = x; i < x + n-1; i++) //矩阵上部matrix[y][i] = start++;for (j = y; j < y + n-1; j++) //右部matrix[j][x+n-1] = start++;for (i = x+n-1; i > x; i--) //底部matrix[y+n-1][i] = start++;for (j = y+n-1; j > y; j--) //左部matrix[j][x] = start++;SetMatrix(x+1, y+1, start, n-2); //递归}void main() {int i, j;int n;scanf("%d", &n);SetMatrix(0, 0, 1, n);//打印螺旋矩阵for(i = 0; i < n; i++) {for (j = 0; j < n; j++)printf("%4d", matrix[i][j]);printf("\n");}}

斐波拉契数列递归实现的方法如下:

int Funct( int n ){if(n==0) return 1;if(n==1) return 1;retrurn Funct(n-1) + Funct(n-2);}请问,如何不使用递归,来实现上述函数?请教各位高手!解答:int Funct( int n ) // n 为非负整数{int a=0;int b=1;int c;if(n==0) c=1;else if(n==1) c=1;else for(int i=2;i<=n;i++) //应该n从2开始算起{c=a+b;a=b;b=c;}return c;}

解答:
现在大多数系统都是将低字位放在前面,而结构体中位域的申明一般是先声明高位。
100 的二进制是 001 100 100
低位在前 高位在后
001----s3
100----s2
100----s1
所以结果应该是 1
如果先申明的在低位则:
001----s1
100----s2
100----s3
结果是 4
1、原题跟little-endian,big-endian没有关系
2、原题跟位域的存储空间分配有关,到底是从低字节分配还是从高字节分配,从Dev C++和VC7.1上看,都是从低字节开始分配,并且连续分配,中间不空,不像谭的书那样会留空位
3、原题跟编译器有关,编译器在未用堆栈空间的默认值分配上有所不同,Dev C++未用空间分配为
01110111b,VC7.1下为11001100b,所以在Dev C++下的结果为5,在VC7.1下为1。

注:PC一般采用little-endian,即高高低低,但在网络传输上,一般采用big-endian,即高低低高,华为是做网络的,所以可能考虑big-endian模式,这样输出结果可能为4

判断一个字符串是不是回文

int IsReverseStr(char *aStr){int i,j;int found=1;if(aStr==NULL)return -1;j=strlen(aStr);for(i=0;i<j/2;i++)if(*(aStr+i)!=*(aStr+j-i-1)){found=0;break;}return found;}

Josephu 问题为:设编号为1,2,… n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。

数组实现:

#include <stdio.h>#include <malloc.h>int Josephu(int n, int m){int flag, i, j = 0;int *arr = (int *)malloc(n * sizeof(int));for (i = 0; i < n; ++i)arr[i] = 1;for (i = 1; i < n; ++i){flag = 0;while (flag < m){if (j == n)j = 0;if (arr[j])++flag;++j;}arr[j - 1] = 0;printf("第%4d个出局的人是:%4d号\n", i, j);}free(arr);return j;}int main(){int n, m;scanf("%d%d", &n, &m);printf("最后胜利的是%d号!\n", Josephu(n, m));system("pause");return 0;}链表实现:#include <stdio.h>#include <malloc.h>typedef struct Node{int index;struct Node *next;}JosephuNode;int Josephu(int n, int m){int i, j;JosephuNode *head, *tail;head = tail = (JosephuNode *)malloc(sizeof(JosephuNode));for (i = 1; i < n; ++i){tail->index = i;tail->next = (JosephuNode *)malloc(sizeof(JosephuNode));tail = tail->next;}tail->index = i;tail->next = head;for (i = 1; tail != head; ++i){for (j = 1; j < m; ++j){tail = head;head = head->next;}tail->next = head->next;printf("第%4d个出局的人是:%4d号\n", i, head->index);free(head);head = tail->next;}i = head->index;free(head);return i;}int main(){int n, m;scanf("%d%d", &n, &m);printf("最后胜利的是%d号!\n", Josephu(n, m));system("pause");return 0;}

已知strcpy函数的原型是:

char * strcpy(char * strDest,const char * strSrc);
1.不调用库函数,实现strcpy函数。
2.解释为什么要返回char *。
解说:
1.strcpy的实现代码

char * strcpy(char * strDest,const char * strSrc){if ((strDest==NULL)||(strSrc==NULL)) file://[/1]throw "Invalid argument(s)"; //[2]char * strDestCopy=strDest; file://[/3]while ((*strDest++=*strSrc++)!='\0'); file://[/4]return strDestCopy;}

错误的做法:
[1]
(A)不检查指针的有效性,说明答题者不注重代码的健壮性。
(B)检查指针的有效性时使用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),说明答题者对C语言中类型的隐式转换没有深刻认识。在本例中char *转换为bool即是类型隐式转换,这种功能虽然灵活,但更多的是导致出错概率增大和维护成本升高。所以C++专门增加了bool、true、false三个关键字以提供更安全的条件表达式。
(C)检查指针的有效性时使用((strDest==0)||(strSrc==0)),说明答题者不知道使用常量的好处。直接使用字面常量(如本例中的0)会减少程序的可维护性。0虽然简单,但程序中可能出现很多处对指针的检查,万一出现笔误,编译器不能发现,生成的程序内含逻辑错误,很难排除。而使用NULL代替0,如果出现拼写错误,编译器就会检查出来。
[2]
(A)return new string("Invalid argument(s)");,说明答题者根本不知道返回值的用途,并且他对内存泄漏也没有警惕心。从函数中返回函数体内分配的内存是十分危险的做法,他把释放内存的义务抛给不知情的调用者,绝大多数情况下,调用者不会释放内存,这导致内存泄漏。
(B)return 0;,说明答题者没有掌握异常机制。调用者有可能忘记检查返回值,调用者还可能无法检查返回值(见后面的链式表达式)。妄想让返回值肩负返回正确值和异常值的双重功能,其结果往往是两种功能都失效。应该以抛出异常来代替返回值,这样可以减轻调用者的负担、使错误不会被忽略、增强程序的可维护性。
[3]
(A)忘记保存原始的strDest值,说明答题者逻辑思维不严密。
[4]
(A)循环写成while (*strDest++=*strSrc++);,同[1](B)。
(B)循环写成while (*strSrc!='\0') *strDest++=*strSrc++;,说明答题者对边界条件的检查不力。循环体结束后,strDest字符串的末尾没有正确地加上'\0'。


原创粉丝点击