华为笔试-嵌入式开发(三)
2016-07-18 17:26
225 查看
1. 找错
void test1()
{
char string[10];
char* str1="0123456789";
strcpy(string, str1);
} 答:表面上并且编译都不会错误。但如果string数组原意表示的是字符串的话,那这个赋值就没有达到意图。最好定义为char
string[11],这样最后一个元素可以存储字符串结尾符'\0'; void test2() { char string[10], str1[10]; for(int I=0; I <10;I++) { str1[I] ='a'; } strcpy(string, str1); }
答:strcpy使用错误,strcpy只有遇到字符串末尾的'\0'才会结束,而str1并没有结尾标志,导致strcpy函数越界访问,不妨让str1[9]='\0',这样就正常了。
void test3(char* str1) { char string[10]; if(strlen(str1) <=10) { strcpy(string, str1); } }
答:这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符'\0'的,如果str1刚好为10个字符+1结尾符,string就得不到结尾符了。可将strlen(str1)
<=10改为strlen(str1) <10。
2. 找错
#define MAX_SRM 256 DSN get_SRM_no()
{ static int SRM_no;
int I;
for(I=0;I <MAX_SRM;I++,SRM_no++)
{
SRM_no%=MAX_SRM;
if(MY_SRM.state==IDLE)
{ break; }
}
if(I>=MAX_SRM)
return (NULL_SRM);
else
return SRM_no;
} 答:我不知道这段代码的具体功能,但明显有两个错误
1,SRM_no没有赋初值
2,由于static的声明,使该函数成为不可重入(即不可预测结果)函数,因为SRM_no变量放在程序的全局存储区中,每次调用的时候还可以保持原来的赋值。这里应该去掉static声明。
3. 写出程序运行结果
int sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
int I;
int a=2;
for(I=0;I <5;I++)
{
printf("%d,", sum(a));
}
} 答:8,10,12,14,16
该题比较简单。只要注意b声明为static静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。
4. int func(int a)
{
int b;
switch(a)
{
case 1: b=30;
case 2: b=20;
case 3: b=16;
default: b=0;
}
return b;
} 则func(1)=?
答:func(1)=0,因为没有break语句,switch中会一直计算到b=0。这是提醒我们不要忘了break。呵呵。
5:
int a[3];
a[0]=0;
a[1]=1;
a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则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秒。
答: /*输入年月日时分秒,输出年月日时分秒的下一秒,输出仍然在原内存空间*/
void NextMinute(int *nYear,int *nMonth,int *nDate,int *nHour,int *nMinute,int *nSecond)
{
int nDays;
(*nSecond)++; // 秒加1
if(*nSecond>=60) //
秒满60,做出特殊处理,下面时,日,月等类同 {
*nSecond=0;
(*nMinute)++;
if(*nMinute>=60)
{
*nMinute=0;
(*nHour)++;
if(*nHour>=24)
{
*nHour=0;
(*nDate)++;
switch(*nMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
nDays=31;
break;
case 2:// 判断闰年
if(*nYear%400==0¦¦*nYear%100!=0&&*nYear%4==0) {
nDays=29;
}
else
{
nDays=28;
}
break;
default:
nDays=30;
break;
}
if(*nDate>nDays)
{
*nDate=1;
(*nMonth)++;
if(*nMonth>12)
{
*nMonth=1;
(*nYear)++;
}
}
}
}
}
} /*示例可运行代码*/
Void main()
{
int nYear=2004,nMonth=12,nDate=31,nHour=59,nMinute=59,nSecond=59;
NextMinute(&nYear,&nMonth,&nDate,&nHour,&nMinute,&nSecond);
printf("The result:%d-%d-%d%d:%d:%d",nYear,nMonth,nDate,nHour,nMinute,nSecond); }
void test1()
{
char string[10];
char* str1="0123456789";
strcpy(string, str1);
} 答:表面上并且编译都不会错误。但如果string数组原意表示的是字符串的话,那这个赋值就没有达到意图。最好定义为char
string[11],这样最后一个元素可以存储字符串结尾符'\0'; void test2() { char string[10], str1[10]; for(int I=0; I <10;I++) { str1[I] ='a'; } strcpy(string, str1); }
答:strcpy使用错误,strcpy只有遇到字符串末尾的'\0'才会结束,而str1并没有结尾标志,导致strcpy函数越界访问,不妨让str1[9]='\0',这样就正常了。
void test3(char* str1) { char string[10]; if(strlen(str1) <=10) { strcpy(string, str1); } }
答:这又会出现第一道改错题的错误了。strlen(str1)算出来的值是不包含结尾符'\0'的,如果str1刚好为10个字符+1结尾符,string就得不到结尾符了。可将strlen(str1)
<=10改为strlen(str1) <10。
2. 找错
#define MAX_SRM 256 DSN get_SRM_no()
{ static int SRM_no;
int I;
for(I=0;I <MAX_SRM;I++,SRM_no++)
{
SRM_no%=MAX_SRM;
if(MY_SRM.state==IDLE)
{ break; }
}
if(I>=MAX_SRM)
return (NULL_SRM);
else
return SRM_no;
} 答:我不知道这段代码的具体功能,但明显有两个错误
1,SRM_no没有赋初值
2,由于static的声明,使该函数成为不可重入(即不可预测结果)函数,因为SRM_no变量放在程序的全局存储区中,每次调用的时候还可以保持原来的赋值。这里应该去掉static声明。
3. 写出程序运行结果
int sum(int a)
{
auto int c=0;
static int b=3;
c+=1;
b+=2;
return(a+b+c);
}
void main()
{
int I;
int a=2;
for(I=0;I <5;I++)
{
printf("%d,", sum(a));
}
} 答:8,10,12,14,16
该题比较简单。只要注意b声明为static静态全局变量,其值在下次调用时是可以保持住原来的赋值的就可以。
4. int func(int a)
{
int b;
switch(a)
{
case 1: b=30;
case 2: b=20;
case 3: b=16;
default: b=0;
}
return b;
} 则func(1)=?
答:func(1)=0,因为没有break语句,switch中会一直计算到b=0。这是提醒我们不要忘了break。呵呵。
5:
int a[3];
a[0]=0;
a[1]=1;
a[2]=2;
int *p, *q;
p=a;
q=&a[2];
则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秒。
答: /*输入年月日时分秒,输出年月日时分秒的下一秒,输出仍然在原内存空间*/
void NextMinute(int *nYear,int *nMonth,int *nDate,int *nHour,int *nMinute,int *nSecond)
{
int nDays;
(*nSecond)++; // 秒加1
if(*nSecond>=60) //
秒满60,做出特殊处理,下面时,日,月等类同 {
*nSecond=0;
(*nMinute)++;
if(*nMinute>=60)
{
*nMinute=0;
(*nHour)++;
if(*nHour>=24)
{
*nHour=0;
(*nDate)++;
switch(*nMonth)
{
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
nDays=31;
break;
case 2:// 判断闰年
if(*nYear%400==0¦¦*nYear%100!=0&&*nYear%4==0) {
nDays=29;
}
else
{
nDays=28;
}
break;
default:
nDays=30;
break;
}
if(*nDate>nDays)
{
*nDate=1;
(*nMonth)++;
if(*nMonth>12)
{
*nMonth=1;
(*nYear)++;
}
}
}
}
}
} /*示例可运行代码*/
Void main()
{
int nYear=2004,nMonth=12,nDate=31,nHour=59,nMinute=59,nSecond=59;
NextMinute(&nYear,&nMonth,&nDate,&nHour,&nMinute,&nSecond);
printf("The result:%d-%d-%d%d:%d:%d",nYear,nMonth,nDate,nHour,nMinute,nSecond); }
相关文章推荐
- Redis 学习笔记一
- 图片尺寸调整
- memcached学习笔记1(windows 7 64bit 环境下安装memcached)
- for循环删除(ArrayList.remove)报错及解决办法
- PAT乙级.1011. A+B和C (15)
- skyeye-1.3.5 Configure WARNING: llvm should be 3.0 If you want to compile skyeye with other version!
- 自定义ViewPager指示器
- has text relocations 6.0 M android 环信 so 文件 sdk 版本过低 适配Android6.0
- 关于TCP协议,我想你应该懂了!
- nyoj 35 表达式求值
- 制作OB图的时候,OB玩家进入后就退出的问题
- Spark大师之路:广播变量(Broadcast)源码分析
- iOS 正则表达式判断身份证等
- Hibernate总结(二)--之主键的产生器和对象状态
- UIWebView 使用中遇到的问题(NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802))
- 告诉你哪些单片机项目坚决不接(转贴)
- 计蒜客之简单斐波那契数列
- 解决sublime Text编译python中文脚本出错
- 设置navigationBar颜色,去掉黑线
- bestcoder两周年前三题hdu5718,5719,5720