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],这样最后一个元素可以存储字符串结尾符’′;

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只有遇到字符串末尾的''才会结束,而str1并没有结尾标志,导致strcpy函数越界访问,不妨让str1[9]='',这样就正常了。

1 void test3(char* str1)
2 {
3 char string[10];
4 if(strlen(str1)<=10)
5 {
6 strcpy(string, str1);
7 }
8 }


答:这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符''的,如果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!
”);
70 }


转载者注:(对原文有部分修改)

原文地址:https://www.cnblogs.com/lpxblog/p/5278399.html