C語言面試題大匯總之華為面試題3_第1頁
C語言面試題大匯總之華為面試題3_第2頁
C語言面試題大匯總之華為面試題3_第3頁
C語言面試題大匯總之華為面試題3_第4頁
C語言面試題大匯總之華為面試題3_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

C語言面試題大匯總之華為面試題3資料僅供參考面試經典試題Author:Vince————即使你是個編程高手,你在面試前也應該要看看這套題,她可能會給你帶來好運,否則你有可能后悔當初為什么沒有看而跳樓自殺,這樣我會很內疚的。這套題看似簡單,但你未必能得高分,即使你看不懂也要把她背下來!歡迎轉載此文,轉載時請注明文章來源:文斯測試技術研究中心1編程基礎1.1基本概念1.const的理解:constchar*,charconst*,char*const的區(qū)別問題幾乎是C++面試中每次都會有的題目。事實上這個概念誰都有只是三種聲明方式非常相似很容易記混。Bjarne在她的TheC++ProgrammingLanguage里面給出過一個助記的方法:把一個聲明從右向左讀。char*constcp;(*讀成pointerto)cpisaconstpointertocharconstchar*p;pisapointertoconstchar;charconst*p;同上因為C++里面沒有const*的運算符,因此const只能屬于前面的類型。2.c指針int*p[n];-----指針數組,每個元素均為指向整型數據的指針。int(*p)[n];------p為指向一維數組的指針,這個一維數組有n個整型數據。int*p();----------函數帶回指針,指針指向返回的值。int(*p)();------p為指向函數的指針。3.數組越界問題(這個題目還是有點小險的)下面這個程序執(zhí)行后會有什么錯誤或者效果:#defineMAX255intmain(){unsignedcharA[MAX],i;for(i=0;i<=MAX;i++)A[i]=i;}解答:MAX=255,數組A的下標范圍為:0..MAX-1,這是其一,其二當i循環(huán)到255時,循環(huán)內執(zhí)行:A[255]=255;這句本身沒有問題,可是返回for(i=0;i<=MAX;i++)語句時,由于unsignedchar的取值范圍在(0..255),i++以后i又為0了..無限循環(huán)下去.注:char類型為一個字節(jié),取值范圍是[-128,127],unsignedchar[0,255]4.C++:memset,memcpy和strcpy的根本區(qū)別?答:#include"memory.h"memset用來對一段內存空間全部設置為某個字符,一般用在對定義的字符串進行初始化為''或'';例:chara[100];memset(a,'',sizeof(a));memcpy用來做內存拷貝,你能夠拿它拷貝任何數據類型的對象,能夠指定拷貝的數據長度;例:chara[100],b[50];memcpy(b,a,sizeof(b));注意如用sizeof(a),會造成b的內存地址溢出。strcpy就只能拷貝字符串了,它遇到'\0'就結束拷貝;例:chara[100],b[50];strcpy(a,b);如用strcpy(b,a),要注意a中的字符串長度(第一個'\0'之前)是否超過50位,如超過,則會造成b的內存地址溢出。strcpy原型:externchar*strcpy(char*dest,char*src);

{

ASSERT((dest!=NULL)&&(src!=NULL));

Char*address=dest;

While((*dest++=*src++)!=’\0’)

Continue;

Returndest;

}用法:#include<string.h>功能:把src所指由NULL結束的字符串復制到dest所指的數組中。說明:src和dest所指內存區(qū)域不能夠重疊且dest必須有足夠的空間來容納src的字符串。返回指向dest的指針。memcpy原型:externvoid*memcpy(void*dest,void*src,unsignedintcount);

{

ASSERT((dest!=NULL)&&(src!=NULL));

ASSERT((dest>src+count)||(src>dest+count));//防止內存重疊,也能夠用restrict修飾指針

Byte*bdest=(Byte*)dest;

Byte*bsrc=(Byte*)src;

While(count-->0)

*bdest++=**bsrc++;

Returndest;

}用法:#include<memory.h>功能:由src所指內存區(qū)域復制count個字節(jié)到dest所指內存區(qū)域。說明:src和dest所指內存區(qū)域不能重疊,函數返回指向dest的指針。Memset原型:externvoid*memset(void*buffer,charc,intcount);用法:#include功能:把buffer所指內存區(qū)域的前count個字節(jié)設置成字符c。說明:返回指向buffer的指針。5.ASSERT()是干什么用的答:ASSERT()是一個調試程序時經常使用的宏,在程序運行時它計算括號內的表示式,如果表示式為FALSE(0),程序將報告錯誤,并終止執(zhí)行。如果表示式不為0,則繼續(xù)執(zhí)行后面的語句。這個宏一般原來判斷程序中是否出現了明顯非法的數據,如果出現了終止程序以免導致嚴重后果,同時也便于查找錯誤。例如,變量n在程序中不應該為0,如果為0可能導致錯誤,你能夠這樣寫程序:......ASSERT(n!=0);k=10/n;......ASSERT只有在Debug版本中才有效,如果編譯為Release版本則被忽略。assert()的功能類似,它是ANSIC標準中規(guī)定的函數,它與ASSERT的一個重要區(qū)別是能夠用在Release版本中。6.system("pause");作用?答:系統(tǒng)的暫停程序,按任意鍵繼續(xù),屏幕會打印,"按任意鍵繼續(xù)。。。。。"省去了使用getchar();7.請問C++的類和C里面的struct有什么區(qū)別?答:c++中的類具有成員保護功能,而且具有繼承,多態(tài)這類oo特點,而c里的struct沒有c里面的struct沒有成員函數,不能繼承,派生等等.8.請講一講析構函數和虛函數的用法和作用?答:析構函數也是特殊的類成員函數,它沒有返回類型,沒有參數,不能隨意調用,也沒有重載。只是在類對象生命期結束的時候,由系統(tǒng)自動調用釋放在構造函數中分配的資源。這種在運行時,能依據其類型確認調用那個函數的能力稱為多態(tài)性,或稱遲后聯編。另:析構函數一般在對象撤消前做收尾工作,比如回收內存等工作,虛擬函數的功能是使子類能夠用同名的函數對父類函數進行覆蓋,而且在調用時自動調用子類覆蓋函數,如果是純虛函數,則純粹是為了在子類覆蓋時有個統(tǒng)一的命名而已。注意:子類重新定義父類的虛函數的做法叫覆蓋,override,而不是overload(重載),重載的概念不屬于面向對象編程,重載指的是存在多個同名函數,這些函數的參數表不同..重載是在編譯期間就決定了的,是靜態(tài)的,因此,重載與多態(tài)無關.與面向對象編程無關.含有純虛函數的類稱為抽象類,不能實例化對象,主要用作接口類//9.全局變量和局部變量有什么區(qū)別?是怎么實現的?操作系統(tǒng)和編譯器是怎么知道的?答;全局變量的生命周期是整個程序運行的時間,而局部變量的生命周期則是局部函數或過程調用的時間段。其實現是由編譯器在編譯時采用不同內存分配方法。全局變量在main函數調用后,就開始分配,靜態(tài)變量則是在main函數前就已經初始化了。局部變量則是在用戶棧中動態(tài)分配的(還是建議看編譯原理中的活動記錄這一塊)10.8086是多少位的系統(tǒng)?在數據總線上是怎么實現的?答:8086系統(tǒng)是16位系統(tǒng),其數據總線是20位。12程序設計1.編寫用C語言實現的求n階階乘問題的遞歸算法:答:longintfact(intn)

{If(n==0||n==1)

Return1;ElseReturnn*fact(n-1);}2.二分查找算法:1)遞歸方法實現:intBSearch(elemtypea[],elemtypex,intlow,inthigh){intmid;if(low>high)return-1;mid=(low+high)/2;if(x==a[mid])returnmid;if(x<a[mid])return(BSearch(a,x,low,mid-1));elsereturn(BSearch(a,x,mid+1,high));}2)非遞歸方法實現:intBSearch(elemtypea[],keytypekey,intn){intlow,high,mid;low=0;high=n-1;while(low<=high){mid=(low+high)/2;if(a[mid].key==key)returnmid;elseif(a[mid].key<key)low=mid+1;elsehigh=mid-1;}return-1;}3.遞歸計算如下遞歸函數的值(斐波拉契):f(1)=1f(2)=1f(n)=f(n-1)+f(n-2)n>2解:非遞歸算法:intf(intn){inti,s,s1,s2;s1=1;s2=1;s=1;for(i=3;i<=n;i++){s=s1+s2;s2=s1;s1=s;}return(s);}遞歸算法:Intf(intn){If(n==1||n==2)

Rerurn1;Else

Rerutnf(n-1)+f(n-2);}4.交換兩個數,不用第三塊兒內存:答:inta=……;intb=……;a=a+b;b=a-b;a=a-b;5.冒泡排序:答:voidBubbleSort(elemtypex[],intn)

//時間復雜度為0(n*n);{inti,j;elemtypetemp;for(i=1;i<n;i++)for(j=0;j<n-i;j++)

{if(x[j].key>x[j+1].key){temp=x[j];x[j]=x[j+1];x[j+1]=temp;}}}//補充一個改進的冒泡算法:voidBubbleSort(elemtypex[],intn){Inti,j;BOOLexchange;

//記錄交換標志for(i=1;i<n;++i)

//最多做n-1趟排序{Exchange=false;For(j=n-1;j>=i;--j){If(x[j]>x[j+1]){

x[0]=x[j];

X[j]=x[j+1];

X[j+1]=x[0];

Exchange=true;

//發(fā)生了交換,設置標志為真.}}if(!Exchange)

//為發(fā)生替換,提前終止算法return;}}6.c語言文件讀寫#include"stdio.h"main(){FILE*fp;charch,filename[10];scanf("%s",filename);if((fp=fopen(filename,"w")==NULL){printf("cann'topenfilen");exit(0);}ch=getchar();while(ch!='#'){fputc(ch,fp);putchar(ch);ch=getchar();}fclose(fp);}7.winsocket編程

//這個不錯//服務器代碼#include<Winsock2.h>#include<stdio.h>voidmain(){WORDwVersionRequested;//版本號WSADATAwsaData;

//數據interr;wVersionRequested=MAKEWORD(1,1);err=WSAStartup(wVersionRequested,&wsaData);if(err!=0){return;}if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1){WSACleanup();return;}SOCKETsockSrv=socket(AF_INET,SOCK_STREAM,0);//建立套接字SOCKADDR_INaddrSrv;addrSrv.sin_addr.S_un.S_addr=htonl(INADDR_ANY);addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);bind(sockSrv,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));//綁定端口listen(sockSrv,5);

//轉換socket套接子為偵聽套接子SOCKADDR_INaddrClient;intlen=sizeof(SOCKADDR);while(1)

//無限循環(huán){SOCKETsockConn=accept(sockSrv,(SOCKADDR*)&addrClient,&len);charsendBuf[100];sprint(sendBuf,"Welcome%sto",inet_ntoa(addrClient.sin_addr));send(sockConn,sendBuf,strlen(sendBuf)+1,0);charrecvBuf[100];recv(sockConn,recvBuf);printf("%sn",recvBuf);closesocket(sockConn);WSACleanup();}}注:這是Server端;File->New->Win32ConsoleApplication,工程名:TcpSrv;然后,File->New->C++SourceFile,文件名:TcpSrv;在該工程的Setting的Link的Object/librarymodules項要加入ws2_32.lib#include<Winsock2.h>#include<stdio.h>voidmain(){WORD

wVersionRequested;WSADATA

wsaData;interr;wVersionRequested=MAKEWORD(1,1);err=WSAStartup(wVersionRequested,&wsaData);//啟動winsockDllif(err!=0){return;}if(LOBYTE(wsaData.wVersion)!=1||HIBYTE(wsaData.wVersion)!=1){WSACleanup();return;}SOCKETsockClient=socket(AF_INET,SOCK_STREAM,0);SOCKADDR_INaddrSrv;

addrSrv.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");addrSrv.sin_family=AF_INET;addrSrv.sin_port=htons(6000);connect(sockClient,(SOCKADDR*)&addrSrv,sizeof(SOCKADDR));charrecvBuf[100];recv(sockClient,recvBuf,100,0);printf("%sn",recvBuf);send(sockClient,"Thisiszhangsan",strlen("Thisiszhangsan")+1,0);closesocket(sockClient);WSACleanup();}注:這是Client端;File->New->Win32ConsoleApplication,工程名:TcpClient;然后,File->New->C++SourceFile,文件名:TcpClient;同理,在該工程的Setting的Link的Object/library

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論