姓名:朱軍偉? ? ? ? ? ? ? ?學(xué)號(hào):19170100001? ? ? ? ? ?學(xué)院:電子工程學(xué)院? ? ? ? ? ? 班級(jí):1902015
原文轉(zhuǎn)自:https://download.csdn.net/download/sun_jfly/4326176?utm_medium=distribute.pc_relevant_t0.none-task-download-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-download-2%7Edefault%7EBlogCommendFromMachineLearnPai2%7Edefault-1.control
【嵌牛導(dǎo)讀】任何行業(yè)的終極目標(biāo)都是為了謀求發(fā)展,嵌入式作為一個(gè)前沿行業(yè),我們有必要熟悉一下常見(jiàn)的面試題,我將此作為一個(gè)系列發(fā)布。
【嵌牛鼻子】嵌入式行業(yè)面試題
【嵌牛提問(wèn)】如何輕松應(yīng)對(duì)嵌入式行業(yè)面試?
【嵌牛正文】
公司考試這種題目主要考你編寫的代碼是否考慮到各種情況,是否安全(不會(huì)溢出)
各種情況包括:
1、參數(shù)是指針,檢查指針是否有效
2、檢查復(fù)制的源目標(biāo)和目的地是否為同一個(gè),若為同一個(gè),則直接跳出
3、讀寫權(quán)限檢查
4、安全檢查,是否會(huì)溢出
memcpy 拷貝一塊內(nèi)存,內(nèi)存的大小你告訴它
strcpy 是字符串拷貝,遇到'\0'結(jié)束
/* memcpy ─── 拷貝不重疊的內(nèi)存塊 */
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);//檢查兩個(gè)指針指向的內(nèi)存是否重疊
while(size-->0)
*pbTo++ == *pbFrom++;
return(pvTo);
}
華為面試題:怎么判斷鏈表中是否有環(huán)?
bool CircleInList(Link* pHead)
{
if(pHead = = NULL || pHead->next = = NULL)//無(wú)節(jié)點(diǎn)或只有一個(gè)節(jié)點(diǎn)并且無(wú)自環(huán)
return (false);
if(pHead->next = = pHead)//自環(huán)
return (true);
Link *pTemp1 = pHead;//step 1
Link *pTemp = pHead->next;//step 2
while(pTemp != pTemp1 && pTemp != NULL && pTemp->next != NULL)
{
pTemp1 = pTemp1->next;
pTemp = pTemp->next->next;}
if(pTemp = = pTemp1)
return (true);
return (false);
}
兩個(gè)字符串,s,t;把 t 字符串插入到 s 字符串中,s 字符串有足夠的空間存放 t 字符串
void insert(char *s, char *t, int i)
{
memcpy(&s[strlen(t)+i],&s[i],strlen(s)-i);
memcpy(&s[i],t,strlen(t));
s[strlen(s)+strlen(t)]='\0';
}
1。編寫一個(gè) C 函數(shù),該函數(shù)在一個(gè)字符串中找到可能的最長(zhǎng)的子字符串,且該字符串是由
同一字符組成的。
char * search(char *cpSource, char ch)
{
char *cpTemp=NULL, *cpDest=NULL;
int iTemp, iCount=0;
while(*cpSource)
{
if(*cpSource == ch)
{
iTemp = 0;
cpTemp = cpSource;
while(*cpSource == ch)
++iTemp, ++cpSource;
if(iTemp > iCount)
iCount = iTemp, cpDest = cpTemp;
if(!*cpSource)
break;
}
++cpSource;
}
return cpDest;
}
2。請(qǐng)編寫一個(gè) C 函數(shù),該函數(shù)在給定的內(nèi)存區(qū)域搜索給定的字符,并返回該字符所在位置
索引值。
int search(char *cpSource, int n, char ch)
{
int i;
for(i=0; i<n && *(cpSource+i) != ch; ++i);
return i;}
一個(gè)單向鏈表,不知道頭節(jié)點(diǎn),一個(gè)指針指向其中的一個(gè)節(jié)點(diǎn),問(wèn)如何刪除這個(gè)指針指向的
節(jié)點(diǎn)?
將這個(gè)指針指向的 next 節(jié)點(diǎn)值 copy 到本節(jié)點(diǎn),將 next 指向 next->next,并隨后刪除原 next
指向的節(jié)點(diǎn)。
#include <stdio.h>
void foo(int m, int n)
{
printf("m=%d, n=%d\n", m, n);
}
int main()
{
int b = 3;
foo(b+=3, ++b);
printf("b=%d\n", b);
return 0;
}
輸出:m=7,n=4,b=7(VC6.0)
這種方式和編譯器中得函數(shù)調(diào)用關(guān)系相關(guān)即先后入棧順序。不過(guò)不同
編譯器得處理不同。也是因?yàn)?C 標(biāo)準(zhǔn)中對(duì)這種方式說(shuō)明為未定義,所以
各個(gè)編譯器廠商都有自己得理解,所以最后產(chǎn)生得結(jié)果完全不同。
因?yàn)檫@樣,所以遇見(jiàn)這種函數(shù),我們首先要考慮我們得編譯器會(huì)如何處理
這樣得函數(shù),其次看函數(shù)得調(diào)用方式,不同得調(diào)用方式,可能產(chǎn)生不同得
結(jié)果。最后是看編譯器優(yōu)化。
2.寫一函數(shù),實(shí)現(xiàn)刪除字符串 str1 中含有的字符串 str2.
第二個(gè)就是利用一個(gè) KMP 匹配算法找到 str2 然后刪除(用鏈表實(shí)現(xiàn)的話,便捷于數(shù)組)
/*雅虎筆試題(字符串操作)
給定字符串 A 和 B,輸出 A 和 B 中的最大公共子串。
比如 A="aocdfe" B="pmcdfa" 則輸出"cdf"
*/
//Author: azhen
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *commanstring(char shortstring[], char longstring[]){
int i, j;
char *substring=malloc(256);
if(strstr(longstring, shortstring)!=NULL) //如果……,那么返回 shortstring
return shortstring;
for(i=strlen(shortstring)-1;i>0; i--) //否則,開(kāi)始循環(huán)計(jì)算
{
for(j=0; j<=strlen(shortstring)-i; j++){
memcpy(substring, &shortstring[j], i);
substring[i]='\0';
if(strstr(longstring, substring)!=NULL)
return substring;
}
}
return NULL;
}
main()
{
char *str1=malloc(256);
char *str2=malloc(256);
char *comman=NULL;
gets(str1);
gets(str2);
if(strlen(str1)>strlen(str2)) //將短的字符串放前面
comman=commanstring(str2, str1);
else
comman=commanstring(str1, str2);
printf("the longest comman string is: %s\n", comman);
}
11.寫一個(gè)函數(shù)比較兩個(gè)字符串 str1 和 str2 的大小,若相等返回 0,若 str1 大于
str2 返回 1,若 str1 小于 str2 返回-1
int strcmp ( const char * src,const char * dst)
{
int ret = 0 ;while( ! (ret = *(unsigned char *)src - *(unsigned char *)dst) && *dst)
{
++src;
++dst;
}
if ( ret < 0 )
ret = -1 ;
else if ( ret > 0 )
ret = 1 ;
return( ret );
}