|
101. 編寫strcat函數(shù)(6分) 已知strcat函數(shù)的原型是char *strcat (char *strDest, const char *strSrc); 其中strDest 是目的字符串,strSrc 是源字符串。 (1)不調(diào)用C++/C 的字符串庫(kù)函數(shù),請(qǐng)編寫函數(shù) strcat 答: VC源碼: char * __cdecl strcat (char * dst, const char * src) { char * cp = dst; while( *cp ) cp++; /* find end of dst */ while( *cp++ = *src++ ) ; /* Copy src to end of dst */ return( dst ); /* return dst */ } (2)strcat能把strSrc 的內(nèi)容連接到strDest,為什么還要char * 類型的返回值? 答:方便賦值給其他變量
102.MFC中CString是類型安全類么? 答:不是,其它數(shù)據(jù)類型轉(zhuǎn)換到CString可以使用CString的成員函數(shù)Format來(lái)轉(zhuǎn)換
103.C++中為什么用模板類。 答:(1)可用來(lái)創(chuàng)建動(dòng)態(tài)增長(zhǎng)和減小的數(shù)據(jù)結(jié)構(gòu) (2)它是類型無(wú)關(guān)的,因此具有很高的可復(fù)用性。 (3)它在編譯時(shí)而不是運(yùn)行時(shí)檢查數(shù)據(jù)類型,保證了類型安全 (4)它是平臺(tái)無(wú)關(guān)的,可移植性 (5)可用于基本數(shù)據(jù)類型
104.CSingleLock是干什么的。 答:同步多個(gè)線程對(duì)一個(gè)數(shù)據(jù)類的同時(shí)訪問(wèn)
105.NEWTEXTMETRIC 是什么。 答:物理字體結(jié)構(gòu),用來(lái)設(shè)置字體的高寬大小
106.程序什么時(shí)候應(yīng)該使用線程,什么時(shí)候單線程效率高。 答:1.耗時(shí)的操作使用線程,提高應(yīng)用程序響應(yīng) 2.并行操作時(shí)使用線程,如C/S架構(gòu)的服務(wù)器端并發(fā)線程響應(yīng)用戶的請(qǐng)求。 3.多CPU系統(tǒng)中,使用線程提高CPU利用率 4.改善程序結(jié)構(gòu)。一個(gè)既長(zhǎng)又復(fù)雜的進(jìn)程可以考慮分為多個(gè)線程,成為幾個(gè)獨(dú)立或半獨(dú) 立的運(yùn)行部分,這樣的程序會(huì)利于理解和修改。 其他情況都使用單線程。
107.Windows是內(nèi)核級(jí)線程么。 答:見(jiàn)下一題
108.Linux有內(nèi)核級(jí)線程么。 答:線程通常被定義為一個(gè)進(jìn)程中代碼的不同執(zhí)行路線。從實(shí)現(xiàn)方式上劃分,線程有兩 種類型:“用戶級(jí)線程”和“內(nèi)核級(jí)線程”。 用戶線程指不需要內(nèi)核支持而在用戶程序 中實(shí)現(xiàn)的線程,其不依賴于操作系統(tǒng)核心,應(yīng)用進(jìn)程利用線程庫(kù)提供創(chuàng)建、同步、調(diào)度 和管理線程的函數(shù)來(lái)控制用戶線程。這種線程甚至在象 DOS 這樣的操作系統(tǒng)中也可實(shí)現(xiàn) ,但線程的調(diào)度需要用戶程序完成,這有些類似 Windows 3.x 的協(xié)作式多任務(wù)。另外一 種則需要內(nèi)核的參與,由內(nèi)核完成線程的調(diào)度。其依賴于操作系統(tǒng)核心,由內(nèi)核的內(nèi)部 需求進(jìn)行創(chuàng)建和撤銷,這兩種模型各有其好處和缺點(diǎn)。用戶線程不需要額外的內(nèi)核開(kāi)支 ,并且用戶態(tài)線程的實(shí)現(xiàn)方式可以被定制或修改以適應(yīng)特殊應(yīng)用的要求,但是當(dāng)一個(gè)線 程因 I/O 而處于等待狀態(tài)時(shí),整個(gè)進(jìn)程就會(huì)被調(diào)度程序切換為等待狀態(tài),其他線程得不 到運(yùn)行的機(jī)會(huì);而內(nèi)核線程則沒(méi)有各個(gè)限制,有利于發(fā)揮多處理器的并發(fā)優(yōu)勢(shì),但卻占 用了更多的系統(tǒng)開(kāi)支。 Windows NT和OS/2支持內(nèi)核線程。Linux 支持內(nèi)核級(jí)的多線程
109.C++中什么數(shù)據(jù)分配在?;蚨阎?,New分配數(shù)據(jù)是在近堆還是遠(yuǎn)堆中? 答:棧: 存放局部變量,函數(shù)調(diào)用參數(shù),函數(shù)返回值,函數(shù)返回地址。由系統(tǒng)管理 堆: 程序運(yùn)行時(shí)動(dòng)態(tài)申請(qǐng),new 和 malloc申請(qǐng)的內(nèi)存就在堆上
110.使用線程是如何防止出現(xiàn)大的波峰。 答:意思是如何防止同時(shí)產(chǎn)生大量的線程,方法是使用線程池,線程池具有可以同時(shí)提 高調(diào)度效率和限制資源使用的好處,線程池中的線程達(dá)到最大數(shù)時(shí),其他線程就會(huì)排隊(duì) 等候。
111.一般數(shù)據(jù)庫(kù)若出現(xiàn)日志滿了,會(huì)出現(xiàn)什么情況,是否還能使用? 答:只能執(zhí)行查詢等讀操作,不能執(zhí)行更改,備份等寫操作,原因是任何寫操作都要記 錄日志。也就是說(shuō)基本上處于不能使用的狀態(tài)。
112 SQL Server是否支持行級(jí)鎖,有什么好處? 答:支持,設(shè)立封鎖機(jī)制主要是為了對(duì)并發(fā)操作進(jìn)行控制,對(duì)干擾進(jìn)行封鎖,保證數(shù)據(jù) 的一致性和準(zhǔn)確性,行級(jí)封鎖確保在用戶取得被更新的行到該行進(jìn)行更新這段時(shí)間內(nèi)不 被其它用戶所修改。因而行級(jí)鎖即可保證數(shù)據(jù)的一致性又能提高數(shù)據(jù)操作的迸發(fā)性。 113 關(guān)于內(nèi)存對(duì)齊的問(wèn)題以及sizof()的輸出 答:編譯器自動(dòng)對(duì)齊的原因:為了提高程序的性能,數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能 地在自然邊界上對(duì)齊。原因在于,為了訪問(wèn)未對(duì)齊的內(nèi)存,處理器需要作兩次內(nèi)存訪問(wèn) ;然而,對(duì)齊的內(nèi)存訪問(wèn)僅需要一次訪問(wèn)。
114. int i=10, j=10, k=3; k*=i+j; k最后的值是? 答:60,此題考察優(yōu)先級(jí),實(shí)際寫成: k*=(i+j);,賦值運(yùn)算符優(yōu)先級(jí)最低
115.對(duì)數(shù)據(jù)庫(kù)的一張表進(jìn)行操作,同時(shí)要對(duì)另一張表進(jìn)行操作,如何實(shí)現(xiàn)? 答:將操作多個(gè)表的操作放入到事務(wù)中進(jìn)行處理
116.TCP/IP 建立連接的過(guò)程?(3-way shake) 答:在TCP/IP協(xié)議中,TCP協(xié)議提供可靠的連接服務(wù),采用三次握手建立一個(gè)連接。 第一次握手:建立連接時(shí),客戶端發(fā)送syn包(syn=j)到服務(wù)器,并進(jìn)入SYN_SEND狀 態(tài),等待服務(wù)器確認(rèn); 第二次握手:服務(wù)器收到syn包,必須確認(rèn)客戶的SYN(ack=j+1),同時(shí)自己也發(fā)送一個(gè) SYN包(syn=k),即SYN+ACK包,此時(shí)服務(wù)器進(jìn)入SYN_RECV狀態(tài); 第三次握手:客戶端收到服務(wù)器的SYN+ACK包,向服務(wù)器發(fā)送確認(rèn)包ACK(ack=k+1) ,此包發(fā)送完畢,客戶端和服務(wù)器進(jìn)入ESTABLISHED狀態(tài),完成三次握手。
117.ICMP是什么協(xié)議,處于哪一層? 答:Internet控制報(bào)文協(xié)議,處于網(wǎng)絡(luò)層(IP層)
118.觸發(fā)器怎么工作的? 答:觸發(fā)器主要是通過(guò)事件進(jìn)行觸發(fā)而被執(zhí)行的,當(dāng)對(duì)某一表進(jìn)行諸如UPDATE、 INSERT 、 DELETE 這些操作時(shí),數(shù)據(jù)庫(kù)就會(huì)自動(dòng)執(zhí)行觸發(fā)器所定義的SQL 語(yǔ)句,從而確保對(duì)數(shù) 據(jù)的處理必須符合由這些SQL 語(yǔ)句所定義的規(guī)則。
119.winsock建立連接的主要實(shí)現(xiàn)步驟? 答:服務(wù)器端:socker()建立套接字,綁定(bind)并監(jiān)聽(tīng)(listen),用accept() 等待客戶端連接。 客戶端:socker()建立套接字,連接(connect)服務(wù)器,連接上后使用send()和recv( ),在套接字上寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesocket()關(guān)閉套接字。 服務(wù)器端:accept()發(fā)現(xiàn)有客戶端連接,建立一個(gè)新的套接字,自身重新開(kāi)始等待連 接。該新產(chǎn)生的套接字使用send()和recv()寫讀數(shù)據(jù),直至數(shù)據(jù)交換完畢,closesock et()關(guān)閉套接字。
120.動(dòng)態(tài)連接庫(kù)的兩種方式? 答:調(diào)用一個(gè)DLL中的函數(shù)有兩種方法: 1.載入時(shí)動(dòng)態(tài)鏈接(load-time dynamic linking),模塊非常明確調(diào)用某個(gè)導(dǎo)出函數(shù) ,使得他們就像本地函數(shù)一樣。這需要鏈接時(shí)鏈接那些函數(shù)所在DLL的導(dǎo)入庫(kù),導(dǎo)入庫(kù)向 系統(tǒng)提供了載入DLL時(shí)所需的信息及DLL函數(shù)定位。 2.運(yùn)行時(shí)動(dòng)態(tài)鏈接(run-time dynamic linking),運(yùn)行時(shí)可以通過(guò)LoadLibrary或Loa dLibraryEx函數(shù)載入DLL。DLL載入后,模塊可以通過(guò)調(diào)用GetProcAddress獲取DLL函數(shù)的 出口地址,然后就可以通過(guò)返回的函數(shù)指針調(diào)用DLL函數(shù)了。如此即可避免導(dǎo)入庫(kù)文件了 。
121.IP組播有那些好處? 答:Internet上產(chǎn)生的許多新的應(yīng)用,特別是高帶寬的多媒體應(yīng)用,帶來(lái)了帶寬的急劇 消耗和網(wǎng)絡(luò)擁擠問(wèn)題。組播是一種允許一個(gè)或多個(gè)發(fā)送者(組播源)發(fā)送單一的數(shù)據(jù)包 到多個(gè)接收者(一次的,同時(shí)的)的網(wǎng)絡(luò)技術(shù)。組播可以大大的節(jié)省網(wǎng)絡(luò)帶寬,因?yàn)闊o(wú) 論有多少個(gè)目標(biāo)地址,在整個(gè)網(wǎng)絡(luò)的任何一條鏈路上只傳送單一的數(shù)據(jù)包。所以說(shuō)組播 技術(shù)的核心就是針對(duì)如何節(jié)約網(wǎng)絡(luò)資源的前提下保證服務(wù)質(zhì)量。
122. 以下代碼中的兩個(gè)sizeof用法有問(wèn)題嗎?[C易] void UpperCase( char str[] ) // 將 str 中的小寫字母轉(zhuǎn)換成大寫字母 { for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i ) if( ‘a(chǎn)’<=str[i] && str[i]<=’z’ ) str[i] -= (‘a(chǎn)’-'A’ ); } char str[] = “aBcDe”; cout << “str字符長(zhǎng)度為: ” << sizeof(str)/sizeof(str[0]) << endl; UpperCase( str ); cout << str << endl;
答:函數(shù)內(nèi)的sizeof有問(wèn)題。根據(jù)語(yǔ)法,sizeof如用于數(shù)組,只能測(cè)出靜態(tài)數(shù)組的大小,無(wú)法檢測(cè)動(dòng)態(tài)分配的或外部數(shù)組大小。函數(shù)外的str是一個(gè)靜態(tài)定義的數(shù)組,因此其大小為
123,函數(shù)內(nèi)的str實(shí)際只是一個(gè)指向字符串的指針,沒(méi)有任何額外的與數(shù)組相關(guān)的信息,因此sizeof作用于上只將其當(dāng)指針看,一個(gè)指針為4個(gè)字節(jié),因此返回4。
一個(gè)32位的機(jī)器,該機(jī)器的指針是多少位 指針是多少位只要看地址總線的位數(shù)就行了。80386以后的機(jī)子都是32的數(shù)據(jù)總線。所以指針的位數(shù)就是4個(gè)字節(jié)了。
124. main() { int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1);
printf(“%d,%d”,*(a+1),*(ptr-1)); } 輸出:2,5 *(a+1)就是a[1],*(ptr-1)就是a[4],執(zhí)行結(jié)果是2,5 &a+1不是首地址+1,系統(tǒng)會(huì)認(rèn)為加一個(gè)a數(shù)組的偏移,是偏移了一個(gè)數(shù)組的大小(本例是5個(gè)int) int *ptr=(int *)(&a+1); 則ptr實(shí)際是&(a[5]),也就是a+5 原因如下: &a是數(shù)組指針,其類型為 int (*)[5]; 而指針加1要根據(jù)指針類型加上一定的值, 不同類型的指針+1之后增加的大小不同 a是長(zhǎng)度為5的int數(shù)組指針,所以要加 5*sizeof(int) 所以ptr實(shí)際是a[5] 但是prt與(&a+1)類型是不一樣的(這點(diǎn)很重要) 所以prt-1只會(huì)減去sizeof(int*) a,&a的地址是一樣的,但意思不一樣,a是數(shù)組首地址,也就是a[0]的地址,&a是對(duì)象(數(shù)組)首地址,a+1是數(shù)組下一元素的地址,即a[1],&a+1是下一個(gè)對(duì)象的地址,即a[5].
125.請(qǐng)問(wèn)以下代碼有什么問(wèn)題: int main() { char a; char *str=&a; strcpy(str,”hello”); printf(str); return 0; } 沒(méi)有為str分配內(nèi)存空間,將會(huì)發(fā)生異常 問(wèn)題出在將一個(gè)字符串復(fù)制進(jìn)一個(gè)字符變量指針?biāo)傅刂?。雖然可以正確輸出結(jié)果,但因?yàn)樵浇邕M(jìn)行內(nèi)在讀寫而導(dǎo)致程序崩潰。
char* s=”AAA”; printf(“%s”,s); s[0]=’B'; printf(“%s”,s); 有什么錯(cuò)? “AAA”是字符串常量。s是指針,指向這個(gè)字符串常量,所以聲明s的時(shí)候就有問(wèn)題。 cosnt char* s=”AAA”; 然后又因?yàn)槭浅A浚詫?duì)是s[0]的賦值操作是不合法的。
126、關(guān)鍵字volatile有什么含意?并舉出三個(gè)不同的例子? 提示編譯器對(duì)象的值可能在編譯器未監(jiān)測(cè)到的情況下改變。
127、將樹(shù)序列化 轉(zhuǎn)存在數(shù)組或 鏈表中
128.下面哪個(gè)實(shí)體不是SIP協(xié)議定義的(A)。 A )MGC B)UA C)proxy D)Redirector UA = User Agent 用戶代理,指客戶端的協(xié)議棧 PROXY = SIP Proxy ,指SIP服務(wù)器 Redirector = 重定向模塊。一般用于跨服務(wù)器通訊 129.VOIP中本端與對(duì)端呼叫接通后,將通話轉(zhuǎn)接到第三方稱之為(C)。 A)呼叫轉(zhuǎn)接 B)呼叫前轉(zhuǎn) C)呼叫轉(zhuǎn)移 D)三方通話 跟普通電話相同,A,B都是沒(méi)有接通前就把呼叫轉(zhuǎn)接。D是指三方同時(shí)在通話。 130.VOIP的主要優(yōu)點(diǎn)是(D) A)價(jià)格便宜并且能為客戶提供更好的增值服務(wù)。 B)語(yǔ)音質(zhì)量比傳統(tǒng)的PSTN電話好。 C)通話的安全性和可靠性有更高的保障。 D)不需要服務(wù)提供商就可以使用。 音質(zhì),可靠性是傳統(tǒng)電話好。這題的問(wèn)題在于,增值服務(wù)是指什么?如是SP則VOIP不支持。還是服務(wù)器提供商是指什么?VOIP需要服務(wù)器。 131.下面哪個(gè)技術(shù)不屬于語(yǔ)音處理技術(shù)(D) A)靜音檢測(cè) B)分組丟失補(bǔ)償 C)同聲消除 D)網(wǎng)路穿越 D是網(wǎng)絡(luò)傳輸?shù)膯?wèn)題,主要是穿透NAT網(wǎng)關(guān)。特別是比較復(fù)雜的網(wǎng)絡(luò)。 132.SIP協(xié)議是使用下面哪種方式編解碼的() A)ASN.1 B)BER C)ABNF D)PER
網(wǎng)絡(luò)應(yīng)用 133.在不同網(wǎng)絡(luò)中MTU會(huì)發(fā)生變化,由于MTU的變化,會(huì)導(dǎo)致那些值也相應(yīng)發(fā)生變化(A) A)IP總長(zhǎng)度字段 B)TCP MSS字段 C)UDP長(zhǎng)度字段 D)TCP長(zhǎng)度字段 待查,MTU變化會(huì)讓IP分片或重組。因此變化就是IP 134.下列關(guān)于TCP和UDP的正確的說(shuō)法是(C) A)TCP實(shí)時(shí)性比UDP好 B)TCP比UDP效率高 C)TCP首部比UDP的首部長(zhǎng) D)TCP安全性比UDP高 實(shí)時(shí)性,效率。安全性,TCP不見(jiàn)得比UDP高 135.一個(gè)套接口應(yīng)該匹配(D) A)源目標(biāo)IP B)源目標(biāo)IP端口 C)目標(biāo)IP和目標(biāo)端口 D)本地IP和本地端口 SOCKET相當(dāng)一IP連接上用端口標(biāo)識(shí)隊(duì)列 136.TCP服務(wù)器出現(xiàn)異常并馬上重啟,通常會(huì)出現(xiàn)那些情況() A)socket調(diào)用失敗 B)bind調(diào)用失敗 C)listen調(diào)用失敗 D)select調(diào)用失敗 此題有問(wèn)題,一般軟件很難自動(dòng)重啟。而TCP服務(wù)器可以在任何一個(gè)階段出問(wèn)題,上述哪一個(gè)都能出現(xiàn),這個(gè)本意應(yīng)該是指Select. 底層開(kāi)發(fā) 137.在一臺(tái)以字節(jié)為最小存儲(chǔ)單位的機(jī)器上,如果把0×12345678寫到從0×0000開(kāi)始的地址上,下列關(guān)于big—endian和little—enddian說(shuō)法正確的是(B) A)在big—endian模式下,地址0×0000到0×0003存儲(chǔ)的數(shù)據(jù)依次為:0×56,0×78,0×12,0×34 B)在big—endian模式下,地址0×0000到0×0003存儲(chǔ)的數(shù)據(jù)依次為:0×12,0×34,0×56,0×78 C)在little—endian模式下,地址0×0000到0×0003存儲(chǔ)的數(shù)據(jù)依次為:0×34,0×12,0×78,0×56 D)在little—endian模式下,地址0×0000到0×0003存儲(chǔ)的數(shù)據(jù)依次為:0×56,0×78,0×12,0×34
138.以下關(guān)于交叉編譯器概述正確的是(A) A)交叉編譯器一般按照CPU類型分類,不同的CPU就有不同的交叉編譯器 B)交叉編譯器的速度比其他編譯器的速度要快 C)linux開(kāi)發(fā)環(huán)境中的交叉編譯器不是gcc編譯器 D)交叉編譯器編譯出來(lái)的目標(biāo)文件一般也能在開(kāi)發(fā)機(jī)(普通PC)上運(yùn)行 139.以下關(guān)于linux下中斷的說(shuō)法正確的是() A)中斷只能由硬件產(chǎn)生 B)中斷服務(wù)例程不能運(yùn)行參數(shù)傳遞 C)中斷服務(wù)例程可以在函數(shù)結(jié)束的時(shí)候返回一個(gè)值 D)中斷服務(wù)例程是不可中斷的 D,B? 140.以下關(guān)于linux下系統(tǒng)調(diào)用的說(shuō)法錯(cuò)誤的是() A)應(yīng)用程序通過(guò)系統(tǒng)調(diào)用訪問(wèn)內(nèi)核 B)每個(gè)系統(tǒng)調(diào)用都有一個(gè)唯一的系統(tǒng)調(diào)用號(hào) C)用戶可以定制自己的系統(tǒng)調(diào)用 D) 可能是A,系統(tǒng)調(diào)用在內(nèi)核執(zhí)行。但這里訪問(wèn)比較模糊。 141.關(guān)于SPI說(shuō)法正確的是() A)SPI工作在全雙工模式下 B) C) D)SPI接口一般工作在主從模式下
C語(yǔ)言 142.Char Test[10];char *pTest=test;問(wèn):&Test在數(shù)值上等于(A) A)Test B) Test[0] C)&pTest D)符號(hào)表某個(gè)符號(hào)的地址 &Test相當(dāng)于二維指針首指針,TEST是一維的首指針 143.在順序表{3,6,8,10,12,15,16,18,21,25,30}中,用二分法查找關(guān)鍵碼值11,所雪的關(guān)鍵碼比較次數(shù)為()B? A)2 B)3 C)4 D)5 144.單鏈表中每個(gè)結(jié)點(diǎn)中包括一個(gè)指針link,它向該結(jié)點(diǎn),現(xiàn)要將指針q指向的新結(jié)點(diǎn)放到指針p指向的單鏈表接點(diǎn)之后,下面的操作序列中哪一個(gè)是正確的(C) A)q:=p^.link;p^.link:=q^:link B)p^.link:=q^.link;q:=p^.link C)q^.link:=p^.link;p^.link:=q D)p^.link:=q;q^.link:=p^.link 145.以下敘述正確的是(C) A)在C程序中,main函數(shù)必須位于程序的最前面 B)C程序的每行中只能寫一條語(yǔ)句 C)C語(yǔ)言本身沒(méi)有輸入輸出語(yǔ)句 D)在對(duì)一個(gè)C程序進(jìn)行編譯的過(guò)程中,可發(fā)現(xiàn)注釋中的拼寫錯(cuò)誤 146.有以下程序 Main() { Char a[]=”programming”,b[]=”language”; Char *p1,*p2; Int i; P1=a;p2=b; For(i=0;i<7;i++) If(*(p1+i)==*(p2+i)) Printf(“%c”,*(p1+i)); ) 打印出什么()
147.請(qǐng)簡(jiǎn)述以下兩個(gè)for循環(huán)的優(yōu)缺點(diǎn)(6分)
148.位運(yùn)算:給定一個(gè)整型變量a,(1)給bit3置數(shù)(2)清除bit3(6分) a|=(0×1<<3); a&=~(0×1<<3); 149.評(píng)述下面的代碼(6分) Main() { Int a[100]; Int *p; P=((unsigned int *)a+1); Printf(“0x%x”,*p); } 1.數(shù)組沒(méi)有賦初值, 2.指針類型轉(zhuǎn)換不一致 3..打印一個(gè)未賦值的整數(shù)值,p=a[1]
#include <stdio.h> main() { int a[100]={1,2,3}; unsigned int *p; p=((unsigned int *)a+1); printf(“%x,%x\n”,a,p); printf(“0x%x”,*p); getchar(); }
150.編程題;(10分) 從鍵盤輸入一組字符; 字母按升序排列;其余的字符按升序排列 字母放前,其余的放后
例如:輸入:_@AB-@ab 結(jié)果:ABab-@@_ |
|
|