C++笔试题(十)
这些题目相比其他公司的试题,较为基础,全部为C语言,没有涉及C++,但如果不细心,是很难得到较高分数的。另外大家转贴不要去掉我的个人信息啊。互相宣传下网站嘛。
1. 找错
1 void test1() 2 { 3 char string[10]; 4 char* str1=”0123456789″; 5 strcpy(string, str1); 6 }
答:表面上并且编译都不会错误。但如果string数组原意表示的是字符串的话,那这个赋值就没有达到意图。最好定义为char string[11],这样最后一个元素可以存储字符串结尾符’\0′;
1 void test2() 2 { 3 char string[10], str1[10]; 4 for(int I=0; I<10;I++) 5 { 6 str1[I] ='a'; 7 } 8 strcpy(string, str1); 9 }
答:strcpy使用错误,strcpy只有遇到字符串末尾的'\0'才会结束,而str1并没有结尾标志,导致strcpy函数越界访问,不妨让str1[9]='\0',这样就正常了。
1 void test3(char* str1) 2 { 3 char string[10]; 4 if(strlen(str1)<=10) 5 { 6 strcpy(string, str1); 7 } 8 }
答:这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符'\0'的,如果str1刚好为10个字符+1结尾符,string就得不到结尾符了。可将strlen(str1)<=10改为strlen(str1)<10。
2. 找错
1 #define MAX_SRM 256 2 3 DSN get_SRM_no() 4 { 5 static int SRM_no; 6 int I; 7 for(I=0;I<MAX_SRM;I++,SRM_no++) 8 { 9 SRM_no %= MAX_SRM; 10 if(MY_SRM.state==IDLE) 11 { 12 break; 13 } 14 } 15 if(I>=MAX_SRM) 16 return (NULL_SRM); 17 else 18 return SRM_no; 19 }
答:我不知道这段代码的具体功能,但明显有两个错误
1,SRM_no没有赋初值
2,由于static的声明,使该函数成为不可重入(即不可预测结果)函数,因为SRM_no变量放在程序的全局存储区中,每次调用的时候还可以保持原来的赋值。这里应该去掉static声明。
3. 写出程序运行结果
1 int sum(int a) 2 { 3 auto int c=0; 4 static int b=3; 5 c+=1; 6 b+=2; 7 return(a+b+c); 8 } 9 void main() 10 { 11 int I; 12 int a=2; 13 for(I=0;I<5;I++) 14 { 15 printf("%d,", sum(a)); 16 } 17 }
答:8,10,12,14,16
该题比较简单。只要注意b声明为static静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。
----------------------------------------------
插播广告啦:版权所有:朱科 欢迎光临我的网站:www.goodsoft.cn,各位转贴别删,劳动成果啊
----------------------------------------------
4.
1 int func(int a) 2 { 3 int b; 4 switch(a) 5 { 6 case 1: b=30; 7 case 2: b=20; 8 case 3: b=16; 9 default: b=0; 10 } 11 return b; 12 } 13 则func(1)=?
答:func(1)=0,因为没有break语句,switch中会一直计算到b=0。这是提醒我们不要忘了break。呵呵。
5:
1 int a[3]; 2 a[0]=0; a[1]=1; a[2]=2; 3 int *p, *q; 4 p=a; 5 q=&a[2]; 6 则a[q-p]=?
答:a[q-p]=a[2]=2;这题是要告诉我们指针的运算特点
6.
定义 int **a[3][4], 则变量占有的内存空间为:_____
答:此处定义的是指向指针的指针数组,对于32位系统,指针占内存空间4字节,因此总空间为3×4×4=48。
7.
编写一个函数,要求输入年月日时分秒,输出该年月日时分秒的下一秒。如输入2004年12月31日23时59分59秒,则输出2005年1月1日0时0分0秒。
答:
1 /*输入年月日时分秒,输出年月日时分秒的下一秒,输出仍然在原内存空间*/ 2 bool NextMinute(int *nYear,int *nMonth,int *nDate,int *nHour,int *nMinute,int *nSecond) 3 { 4 if(*nYear12 || *nMonth23 || *nHour59 || *nSecond59) return false; 5 int nDays; 6 switch(*nMonth) 7 { 8 case 1: 9 case 3: 10 case 5: 11 case 7: 12 case 8: 13 case 10: 14 case 12: 15 nDays=31; 16 break; 17 case 2:// 判断闰年 18 if(*nYear%400==0||*nYear%100!=0&&*nYear%4==0) 19 { 20 nDays=29; 21 } 22 else 23 { 24 nDays=28; 25 } 26 break; 27 default: 28 nDays=30; 29 break; 30 } 31 if(*nDatenDays) return false; 32 33 (*nSecond)++; // 秒加1 34 if(*nSecond>=60) // 秒满60,做出特殊处理,下面时,日,月等类同 35 { 36 *nSecond=0; 37 (*nMinute)++; 38 if(*nMinute>=60) 39 { 40 *nMinute=0; 41 (*nHour)++; 42 if(*nHour>=24) 43 { 44 *nHour=0; 45 (*nDate)++; 46 if(*nDate>nDays) 47 { 48 *nDate=1; 49 (*nMonth)++; 50 if(*nMonth>12) 51 { 52 *nMonth=1; 53 (*nYear)++; 54 } 55 } 56 } 57 } 58 } 59 return true; 60 } 61 /*示例可运行代码*/ 62 void main() 63 { 64 int nYear=2004,nMonth=12,nDate=31,nHour=23,nMinute=59,nSecond=59; 65 bool res = NextMinute(&nYear,&nMonth,&nDate,&nHour,&nMinute,&nSecond); 66 if(res) 67 printf(“The result:%d-%d-%d %d:%d:%d”,nYear,nMonth,nDate,nHour,nMinute,nSecond); 68 else 69 printf(“Input error!\n”); 70 }
转载者注:(对原文有部分修改)