- 相關推薦
華為筆試題之十五
華為最新筆試題及其分析

1.printf的輸出問題
printf("%d",total);//this is right
 
printf(total);//this is wrong
 
printf("hello");//but this is right
2.整數類型的長度
 
char 1個子節(jié),8位
unsigned short [int]
 
[signed] short int
 
short 2個字節(jié),16位
 
 
[signed] int
 
unsigned int
 
int 型在vc里是4個子節(jié),32位,也可能是16位,2個字節(jié)
long [int]
 
unsigned long [int]
long型都是32位,4個字節(jié)
float 32 ,4
double 64,8
long double 128,16
char 8,一個字節(jié),存放的實際上是字符的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
 
pDest[pos] = pSrc[pos];
 
}
 
return (char*)pDest;
 
}
存在地問題就是沒有判斷指針是否非法assert(dest !=NULL || src != NULL); 條件為 FLASE 顯示
不調用其他函數,寫一個memcpy的函數,函數原型為
 
void *memcpy(void *dest, void *src, size_t
length);
-----------利用好斷言---------
 
void memcpy(void* pvTo, void* pvFrom, size_t size)
 
{
 
void* pbTo = (byte*)pvTo;
 
void* pbFrom = (byte*)pvFrom;
 
ASSERT(pvTo != NULL && pvFrom !=
NULL);
 
 
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可以省略,但更有利于編譯器發(fā)現錯誤
 
}
 
return addr;
 
}
 
 
void *memcpy(void *dest, const void *src, int count)
 
{
 
ASSERT(dest!= NULL && src!=
NULL);
 
for(int i=0; i< cout; i++)
 
{
 
dest = src;
 
}
 
}
 
int strcmp(const char*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(const char*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: optimize again.
 
int strcmp(const char * str1, const char * str2 )
 
{
 
while(1)
 
{
 
if(*str1 > *str2) return 1;
 
else if(*str1 < *str2) return -1;
 
else if(*str1 == \) return 0;
 
str1++;str2++;
 
}
 
}
【華為筆試題之十五】相關文章:
華為硬件筆試題目08-11
親歷華為面試06-18
華為面試經歷06-18
華為新員工報到Q&A(華為入職須知)04-27
華為面試問題03-24
華為幾號發(fā)工資04-19
華為都有哪些部門02-28
華為資格面試內容08-10
華為d2怎么樣,華為d2好嗎?08-01
簡筆與繁筆教學設計05-27