华为笔试题二

1.printf的输出问题

printf("%d",total);正确
 printf(total);错误
printf("hello");正确


2.整数类型的长度

char 1个子节,8位

unsigned short[int]

[signed] short int

short 2个字节,16位

 

[signed] int

unsigned int

int 型在vc里是4个子节,32位,也可能是16位,2个字节

long [int]

unsigned long[int]

long型都是32位,4个字节

float 32 ,4

double 64,8

long double 128,16

char 8,一个字节,存放的实际上是字符的ascii码

3、找出错误并改正

char *my_cpy(char*src, int len){
char dest[1024];
memcpy(dest, src,len);
return dest;
}


上面的函数是否有问题,如果有指出其所在,如果没有,给出函数功能描述。

答案:

1。数组应该初始化

2。memcpy不判断是否越界,所以调用前应该判断是否越界

3。不应该返回rest,因为这个数组是在函数内部申请的,所以函数结束之后就会消失,指针也会变成“野指针”,所以指向非法地址

最后一个比较隐蔽

char *memcpy( char*dest, const char *src,int len )
{
char* pDest =(char*)dest;
char* pSrc =(char*)src;
int pos;
for(pos=0;pos<len;pos++)
{
pDest[pos] =pSrc[pos];
}
return(char*)pDest;
}


存在地问题就是没有判断指针是否非法assert(dest !=NULL || src != NULL); 条件为 FLASE 显示 如果assert的参数为假,则会先打印出错信息,然后调用abort()来终止程序

不调用其他函数,写一个memcpy的函数,函数原型为

void *memcpy(void*dest, void *src, size_t length);
-----------利用好断言---------
/* memcpy ───拷贝不重叠的内存块 */
void memcpy(void*pvTo, void* pvFrom, size_t size)
{
void* pbTo =(byte*)pvTo;
void* pbFrom =(byte*)pvFrom;
ASSERT(pvTo !=NULL && pvFrom != NULL);
/* 内存块重叠吗?如果重叠,就使用memmove */
ASSERT(pbTo>=pbFrom+size|| pbFrom>=pbTo+size);
while(size-->0)
*pbTo++ ==*pbFrom++;
return(pvTo);
}


-----------------------

常见函数编程:

char *strcpy(char*strDest, const char *strSrc)
{
ASSERT(strDest !=NULL && strSrc != NULL);
char *addr =strDest;
while(*strDest++=*strSrc++)
NULL; //NULL可以省略,但更有利于编译器发现错误
}
return addr;
}
 
void *memcpy(void*dest, const void *src, int count)
{
ASSERT(dest!= NULL&& src!= NULL);
for(int i=0; i<cout; i++)
{
dest[i] = src[i];
}
}
int strcmp(constchar*str1, const char *str2)
{
while (str1 !=NULL && str2 != NULL)
{
if(*str1 <*str2) return -1;
else if(*str1 >*str2) return 1;
else { str1++;str2++;}
}
if(str1 == NULL&& str2 != NULL)
return -1;
else if(str1 !=NULL && str2 == NULL)
return 1;
else return 0;
}
 
//way2: more compact
int strcmp(constchar*str1, const char *str2)
{
int i = strlen(str1 );
int j;
for(j=0; j<=i;j++)
{
if(str1[j] >str2[j]) return 1; //if str2 terminates, then str2[j]=0, str1[j]>str2[j],return 1;
else if(str1[j]< str2[j]) return -1;
else if(str1[j] =='') return 0;
}
}
//way3: optimizeagain.
int strcmp(constchar * str1, const char * str2 )
{
while(1)
{
if(*str1 >*str2) return 1;
else if(*str1 <*str2) return -1;
else if(*str1 =='') return 0;
str1++;str2++;
}
}


 

 

 

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值