100条经典C笔试题
題目來源:
 1、中興、華為、慧通、英華達、微軟亞洲技術中心等中
 外企業面試題目;
 2、C 語言面試寶典(林銳《高質量編程第三版》)。
 說明:
 1、部分C 語言面試題中可能會參雜部分和C++ 相關的知
 識,為了保持題目的靈活性故保留,但選題最終還是
 會以C 語言題目為主體;
 2、以上公司的面試題目已成為國內中小型企業公司出題
 模板;
 3、由于本人的能力有限加上時間倉促,本課件肯定存在
不足之處,懇請各位同學批評指正。
1、請填寫bool , float, 指針變量 與“零值”比較的if
 語句。
 提示:這里“零值”可以是0, 0.0 , FALSE 或者“空指針”
 。例如int 變量n 與“零值”比較的if 語句為:
 if ( n == 0 )
 if ( n != 0 )
 以此類推。
(1)請寫出bool flag 與“零值”比較的if 語句:
 【標準答案】if ( flag ) if ( !flag )
 100 條經典 C語言筆試題目
 (2)請寫出float x 與“零值”比較的if 語句:
 【標準答案】 const float EPSINON = 0.00001;
 if ((x >= - EPSINON) && (x <= EPSINON)
 不可將浮點變量用“==” 或“!=” 與數字比較,應該設法
 轉化成“>=” 或“<=” 此類形式。
 100 條經典 C語言筆試題目
 (3)請寫出char *p 與“零值”比較的if 語句
 【標準答案】 if (p == NULL) if (p != NULL)
2、以下為Linux下的32 位C 程序,請計算sizeof 的
 值。
 char str[] = “Hello” ;
 char *p = str ;
 i nt n = 10;
 請計算
 (1)sizeof (str ) = (2)s i zeof ( p ) =
 (3)sizeof ( n ) =
【標準答案】
(1)6、(2)4 、(3 )4
 (4)void Func ( char str[100])
 {
 …… ;
 }
 請計算sizeof( str ) =
 (5)void * p = mall oc( 100 );
 請計算sizeof ( p ) =
 【標準答案】(4)4、(5)4
4、用變量a 給出下面的定義
 e) 一個有10個指針的數組,該指針是指向一個整型數
 的;
 f) 一個指向有10個整型數數組的指針;
 g) 一個指向函數的指針,該函數有一個整型參數并返
 回一個整型數;
 h) 一個有10個指針的數組,該指針指向一個函數,該
 函數有一個整型參數并返回一個整型數;
 【標準答案】e)int * a[10]; f)int (*a)[10]
 g)int (*a)(int); h) int (*a[10])(int)
5、設有以下說明和定義:
 typedef u nion {long i; int k[5]; char c;} DATE;
 struct data { int cat; DATE cow; double dog;} too;
 DATE max;
 則語句printf("%d",sizeof(struct date)+sizeof(max)); 的
 執行結果是:_____
 【標準答案】DATE是一個union, 變量公用空間. 里面最
 大的變量類型是int[5], 占用20個字節. 所以它的大小是
 20
 data 是一個struct, 每個變量分開占用空間. 依次為int4 +
 DATE20 + double8 = 32.
 所以結果是20 + 32 = 52.
 當然… 在某些16位編輯器下, int 可能是2字節,那么結果
 是int2 + DATE10 + double8 = 20
6、請問以下代碼有什么問題:
 int main()
 {
 char a;
 char *str=&a;
 strcpy(str,“hello”);
 printf(str);
 return 0;
 }
 【標準答案】沒有為str分配內存空間,將會發生異常
 問題出在將一個字符串復制進一個字符變量指針所指
 地址。雖然可以正確輸出結果,但因為越界進行內在
 讀寫而導致程序崩潰。
7、請問以下代碼有什么問題:
 char* s=“AAA”;
 printf("%s",s);
 s[0]=‘B’;
 printf("%s",s);
 有什么錯?
 【標準答案】“AAA” 是字符串常量。s是指針,指向這個
 字符串常量,所以聲明s的時候就有問題。
 cosnt char* s=“AAA”;
 然后又因為是常量,所以對是s[0] 的賦值操作是不合法
 的。
8、int (*s[10])(int) 表示的是什么啊
 【標準答案】int (*s[10])(int) 函數指針數組,每個指針
 指向一個int func(intp aram) 的函數。
9、c和c++ 中的struct有什么不同?
 【標準答案】c和c++ 中struct的主要區別是c中的struct
 不可以含有成員函數,而c++ 中的struct可以。c++ 中
 struct和class的主要區別在于默認的存取權限不同,
 struct默認為public ,而class默認為private
10、void getmemory(char *p)
 {
 p=(char *) malloc(100);
 strcpy(p,“hello world”);
 }
 int main( )
 {
 char *str=NULL;
 getmemory(str);
 printf(“%s/n”,str);
 free(str);
 return 0;
 } 會出現什么問題?
 【標準答案】程序崩潰,getmemory中的malloc 不能返回
 動態內存,free ()對str操作很危險。
11、char szstr[10];
 strcpy(szstr,“0123456789”);
 產生什么結果?為什么?
 【標準答案】長度不一樣,出現段錯誤。
 100 條經典 C語言筆試題目
 12、數組和鏈表的區別?
 【標準答案】數組:數據順序存儲,固定大小;
鏈表:數據可以隨機存儲,大小可動態改變
13、void main()
 {
 char aa[10];
 printf(“%d”,strlen(aa));
 }
 會出現什么問題?打印結果是是多少?
 【標準答案】sizeof()和初不初始化,沒有關系,
 strlen()和初始化有關,打印結果值未知。
14、給定結構struct A
 {
 char t:4;
 char k:4;
 unsigned short i:8;
 unsigned long m;
 }; 問sizeof(A) = ?
 【標準答案】8
15、struct name1{
 char str;
 short x;
 int num;
 } ;求sizeof(name1)?
 【標準答案】8
16、struct name2{
 char str;
 int num;
 short x;
 }; 求sizeof(name2)?
 【標準答案】12
17、程序哪里有錯誤
 wap( int* p1,int* p2 )
 {
 int * p;
 *p = *p1;
 *p1 = *p2;
 *p2 = *p;
 }
【標準答案】p 為野指針
19、(void )ptr 和((void**))ptr 的結果是否相同?其
 中ptr為同一個指針。
 【標準答案】(void )ptr 和((void**))ptr 值是相同的
20、要對絕對地址0x100000賦值,我們可以用
 (unsigned int*)0x100000 = 1234;
 那么要是想讓程序跳轉到絕對地址是0x100000去執行
 ,應該怎么做?
 【標準答案】((void ()( ))0x100000 ) ( );
 首先要將0x100000強制轉換成函數指針,即:
 (void (*)())0x100000
 然后再調用它:
 ((void ()())0x100000)();
22、關于內存的思考題(1)你能看出有什么問題?
23、關于內存的思考題(2)你能看出有什么問題?
25、關于內存的思考題(3)你能看出有什么問題?
26、關于內存的思考題(4)你能看出有什么問題?
27、關鍵字volatile有什么含意? 并給出三個不同的例
 子。
 【參考答案】一個定義為volatile的變量是說這變量可
 能會被意想不到地改變,這樣,編譯器就不會去假設
 這個變量的值了。精確地說就是,優化器在用到這個
 變量時必須每次都小心地重新讀取這個變量的值,而
 不是使用保存在寄存器里的備份。下面是volatile變量
 的幾個例子:
 1). 并行設備的硬件寄存器(如:狀態寄存器)
 2). 一個中斷服務子程序中會訪問到的非自動變量
 (Non-automatic variables)
 3). 多線程應用中被幾個任務共享的變量
28、嵌入式系統經常具有要求程序員去訪問某特定的
 內存位置的特點。在某工程中,要求設置一絕對地址
 為0x67a9的整型變量的值為0xaa66。編譯器是一個純
 粹的ANSI編譯器。寫代碼去完成這一任務。
 【參考答案】這一問題測試你是否知道為了訪問一絕對
 地址把一個整型數強制轉換(typecast )為一指針是合
 法的。這一問題的實現方式隨著個人風格不同而不同
 。典型的類似代碼如下:
 int * ptr;
 ptr= (int *)0x67a9;
 *ptr = 0xaa55;
29、頭文件中的ifndef/define/endif 干什么用?
 【標準答案】防止該頭文件被重復引用。
30、#include <filename.h> 和#include
 “filename.h” 有什么區別?
 【標準答案】對于#include <filename.h> ,編譯器從
 標準庫路徑開始搜索filename.h ;
 對于#include “filename.h” ,編譯器從用戶的工作路
 徑開始搜索filename.h 。
31、const 有什么用途?(請至少說明兩種)
 【標準答案】: (1)可以定義const 常量
 (2)const 可以修飾函數的參數、返回值,甚至函數
 的定義體。被const 修飾的東西都受到強制保護,可
 以預防意外的變動,能提高程序的健壯性。
32、static有什么用途?(請至少說明兩種)
 【標準答案】
33、堆棧溢出一般是由什么原因導致的?
 【標準答案】沒有回收垃圾資源。
34、如何引用一個已經定義過的全局變量?
 【標準答案】可以用引用頭文件的方式,也可以用
 extern 關鍵字,如果用引用頭文件方式來引用某個在
 頭文件中聲明的全局變理,假定你將那個變量寫錯了
 ,那么在編譯期間會報錯,如果你用extern 方式引用
 時,假定你犯了同樣的錯誤,那么在編譯期間不會報
 錯,而在連接期間報錯。
35、全局變量可不可以定義在可被多個.C 文件包含的
 頭文件中?為什么?
 【標準答案】可以,在不同的C 文件中以static形式來聲
 明同名全局變量。可以在不同的C文件中聲明同名的全
 局變量,前提是其中只能有一個C文件中對此變量賦初
 值,此時連接不會出錯。
36、隊列和棧有什么區別?
 【標準答案】隊列先進先出,棧后進先出。
37、Heap與stack的差別。
 【標準答案】Heap是堆,stack是棧。
 Stack的空間由操作系統自動分配/釋放,Heap上的空
 間手動分配/釋放。
 Stack空間有限,Heap是很大的自由存儲區
 C 中的malloc 函數分配的內存空間即在堆上,C++中對
 應的是new 操作符。
 程序在編譯期對變量和函數分配內存都在棧上進行,且
 程序運行過程中函數調用時參數的傳遞也在棧上進行
 。
38、用宏定義寫出swap(x,y),即交換兩數。
 【標準答案】
 #define swap(x, y) (x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);
39、寫一個“標準”宏,這個宏輸入兩個參數并返回較
 小的一個。
 【標準答案】#define Min(X, Y) ((X)>(Y)?(Y):(X))// 結尾
 沒有;
40、帶參宏與帶參函數的區別(至少說出5點)?
 【標準答案】
 帶參宏 帶參函數
 處理時間 編譯時 運行時
 參數類型 無 需定義
 程序長度 變長 不變
 占用存儲空間 否 是
 運行時間 不占運行時間 調用和返回時占
41、關鍵字volatile有什么含意?
 【標準答案】提示編譯器對象的值可能在編譯器未監測
 到的情況下改變。
42、int main()
 {
 int x=3;
 printf("%d",x);
 return 1;
 }
 問函數既然不會被其它函數調用,為什么要返回1?
 【標準答案】mian中,c標準認為0表示成功,非0表示
 錯誤。具體的值是某中具體出錯信息。
43、已知一個數組tabl e ,用一個宏定義,求出數據的
 元素個數。
 【標準答案】
 #define NTBL(table) (sizeof(table)/sizeof(table[0]))
44、A.c 和B.c兩個c文件中使用了兩個相同名字的
 static變量,編譯的時候會不會有問題?這兩個static變量
 會保存到哪里(棧還是堆或者其他的)?
 【標準答案】static的全局變量,表明這個變量僅在本
 模塊中有意義,不會影響其他模塊。
 他們都放在靜態數據區,但是編譯器對他們的命名是
 不同的。
 如果要使變量在其他模塊也有意義的話,需要使用
 extern 關鍵字。
45、static全局變量與普通的全局變量有什么區別?
 【標準答案】 static全局變量只初使化一次,防止在其
 他文件單元中被引用;
46、static局部變量和普通局部變量有什么區別
 【標準答案】static局部變量只被初始化一次,下一次
 依據上一次結果值;
47、static函數與普通函數有什么區別?
 【標準答案】static函數在內存中只有一份,普通函數在
 每個被調用中維持一份拷貝
關于45-47 的參考文章
 全局變量(外部變量)的說明之前再冠以static 就構成了靜態的全局變量
 。全局變量本身就是靜態存儲方式,靜態全局變量當然也是靜態存儲方
 式。這兩者在存儲方式上并無不同。這兩者的區別雖在于非靜態全局變
 量的作用域是整個源程序,當一個源程序由多個源文件組成時,非靜態
 的全局變量在各個源文件中都是有效的。而靜態全局變量則限制了其作
 用域,即只在定義該變量的源文件內有效,在同一源程序的其它源文
 件中不能使用它。由于靜態全局變量的作用域局限于一個源文件內,只
 能為該源文件內的函數公用,因此可以避免在其它源文件中引起錯誤。
 從以上分析可以看出,把局部變量改變為靜態變量后是改變了它的存儲
 方式即改變了它的生存期。把全局變量改變為靜態變量后是改變了它的
 作用域,限制了它的使用范圍。
 static函數與普通函數作用域不同。僅在本文件。只在當前源文件中使
 用的函數應該說明為內部函數(static),內部函數應該在當前源文件中
 說明和定義。對于可在當前源文件以外使用的函數,應該在一個頭文件
 中說明,要使用這些函數的源文件要包含這個頭文件。
48、程序的局部變量存在于___ 中,全局變量存在于
 _中,動態申請數據存在于 中。
 【標準答案】程序的局部變量存在于棧(stack) 中,全局
 變量存在于靜態數據區中,動態申請數據存在于堆(
 heap)中。
49、什么是預編譯,何時需要預編譯:
 【標準答案】1、總是使用不經常改動的大型代碼體
 。
 2、程序由多個模塊組成,所有模塊都使用一組標準
 的包含文件和相同的編譯選項。在這種情況下,可以
 將所有包含文件預編譯為一個預編譯頭。
50、用兩個棧實現一個隊列的功能?要求給出算法和
 思路!
 【參考答案】設2個棧為A,B, 一開始均為空.
 入隊:
 將新元素push入棧A;
 出隊:
 (1)判斷棧B 是否為空;
 (2)如果不為空,則將棧A中所有元素依次pop 出并
 push到棧B;
 (3)將棧B 的棧頂元素pop 出;
51、對于一個頻繁使用的短小函數,在C 語言中應用什
 么實現,在C++ 中應用什么實現?
 【標準答案】c用宏定義,c++ 用inline
52、1. 用預處理指令#define 聲明一個常數,用以表
 明1年中有多少秒(忽略閏年問題)
 【參考答案】#define SECONDS_PER_YEAR (60 * 60
- 24 * 365)UL
53、Typedef 在C 語言中頻繁用以聲明一個已經存在的
 數據類型的同義字。也可以用預處理器做類似的事。例
 如,思考一下下面的例子:
 #define dPS struct s *
 typedef struct s * tPS;
 以上兩種情況的意圖都是要定義dPS 和tPS 作為一個
 指向結構s指針。哪種方法更好呢?(如果有的話)為
 什么?
 【參考答案】這是一個非常微妙的問題,任何人答對這個問題(正當的原
 因)是應當被恭喜的。答案是:typedef 更好。思考下面的例子:
 dPS p 1,p2;
 tPS p3,p4;
 第一個擴展為
 struct s * p1, p2;
 上面的代碼定義p1為一個指向結構的指,p2為一個實際的結構,這也許
 不是你想要的。第二個例子正確地定義了p3 和p4 兩個指針。
54、在C++ 程序中調用被C 編譯器編譯后的函數,
 為什么要加extern “C”?
 【標準答案】C++ 語言支持函數重載,C 語言不支持函
 數重載。函數被C++ 編譯后在庫中的名字與 C 語言的
 不同。假設某個函數的原型為:void foo(int x, int y);
 該函數被C 編譯器編譯后在庫中的名字為_foo ,而
 C++ 編譯器則會產生像_foo_int_int之類的名字。 C++
 提供了C 連接交換指定符號extern“C”來解決名字匹配
 問題。
55、請簡述以下兩個for 循環的優缺點。
【標準答案】
56、語句for( ;1 ;) 有什么問題?它是什么意思?
 【標準答案】死循環,和while(1)相同。
57、do……while和while……do有什么區別?
 【標準答案】前一個循環一遍再判斷,后一個判斷以后
 再循環。
58、請寫出下列代碼的輸出內容
 #include <stdio.h>
 int main()
 {
 int a,b,c,d;
 a=10;
 b=a++;
 c=++a;
 d=10*a++;
 printf(“b,c ,d:%d,%d,%d”,b,c,d );
 return 0;
 }
 【標準答案】10,12,120
59、unsigned char *p1;
 unsigned long *p2;
 p1=(unsigned char *)0x801000;
 p2=(unsigned long *)0x810000;
 請問p1+5= ;
 p2+5= ;
 【標準答案】0x801005、0x810020
60、main()
 {
 int a[5]={1,2,3,4,5};
 int * ptr=(int*)(&a+1);
 printf(“%d,%d”,(a+1),(ptr-1));
 }
 請問輸出:
 【標準答案】2,5
61、請問下面程序有什么錯誤?
 int a[60][250][1000],i,j,k;
 for(k=0;k<=1000;k++)
 for(j=0;j<250;j++)
 for(i=0;i<60;i++)
 a[i][j][k]=0;
 【標準答案】把循環語句內外換一下。
62、以下是求一個數的平方的程序,請找出錯誤:
 #define SQUARE(a)((a)*(a))
 int a=5;
 int b;
 b=SQUARE(a++);
 【標準答案】宏在預編譯時會以替換的形式展開,僅僅
 會替換。涉及到宏的地方,不要用+±- ,標準中對此
 沒有規定,因此最終結果將會依賴于不同的編譯器。
 執行程序的答案可能是25、也有可能是36。
63、#define Max_CB 500
 void LmiQueryCSmd(StructMSgCB * pmsg)
 {
 unsigned char ucCmdNum;
 …
 for(ucCmdNum=0;ucCmdNum<Max_CB;ucCmdN
 um++)
 {
 …;
 }
 } 這段代碼執行有什么問題?
 【標準答案】死循環
 unsigned char //無符號字符型表示范圍0~255
 char // 有符號字符型 表示范圍-128~127
64、嵌入式系統中經常要用到無限循環,你怎么用C
 編寫死循環。
 【標準答案】while(1){}或者for(;😉
 100 條經典 C語言筆試題目
 65、程序輸出結果是?
 【標準答案】8 ,10,12,14,16
66、
 【標準答案】16
67、int modifyvalue()
 {
 return(x+=10);
 }
 int c hangevalue(int x )
 {
 return(x+=1);
 }
 void m ain()
 {
 int x =10;
 x++;
 changevalue(x);
 x++;
 modifyvalue();
 printf(“First output:%dn”,x);
 x++;
 changevalue(x);
 printf(“Second output:%dn”,x);
 modifyvalue();
 printf(“Thirdoutput:%dn”,x);
 }輸出?
 【標準答案】12、13、13
68、不能做switch()的參數類型是:
 【標準答案】switch 的參數不能為實型。
69、請寫出下列代碼的輸出內容
 #i nclude<stdio.h>
 main()
 {
 int a,b,c,d;
 a=10;
 b=a++;
 c=++a;
 d=10*a++;
 printf(“b,c ,d:%d,%d,%d”,b,c,d );
 return 0;
 }
 【標準答案】10,12,120
70、找出程序的錯誤。
 【標準答案】
71、一語句實現x是否為2 的若干次冪的判斷。
 【參考答案】 void mai n()
 {
 i nt a;
 scanf(“%d”,&a);
 printf(“%c”,(a)&(a-1)?’n’:’y’); // 若是打印y,否則n
 }
72、中斷是嵌入式系統中重要的組成部分,這導致了很多編譯開發商提
 供一種擴展—讓標準C 支持中斷。具代表事實是,產生了一個新的關鍵字
 __interrupt 。下面的代碼就使用了__interrupt 關鍵字去定義了一個中斷服
 務子程序(ISR),請評論一下這段代碼的。
 __interrupt double compute_area (double radius)
 {
 double area = PI * radius * radius;
 printf(" Area = %f", area);
 return area;
 }
 【參考答案】這個函數有太多的錯誤了,以至讓人不知從何說起了:
 1). ISR 不能返回一個值。如果你不懂這個,那么你不會被雇用的。
 2). ISR 不能傳遞參數。如果你沒有看到這一點,你被雇用的機會等同第
 一項。
 3). 在許多的處理器/編譯器中,浮點一般都是不可重入的。有些處理器/編
 譯器需要讓額處的寄存器入棧,有些處理器/編譯器就是不允許在ISR 中做
 浮點運算。此外,ISR 應該是短而有效率的,在ISR 中做浮點運算是不明
 智的。
 4). 與第三點一脈相承,printf() 經常有重入和性能上的問題。如果你丟掉
 了第三和第四點,我不會太為難你的。不用說,如果你能得到后兩點,那
 么你的被雇用前景越來越光明了。
73、下面的代碼輸出是什么,為什么?
 void foo(void)
 {
 unsigned int a = 6;
 int b = -20;
 (a+b> 6)? puts("> 6") : puts("<= 6");
 }
 【參考答案】這個問題測試你是否懂得C 語言中的整數自動轉換原則,
 我發現有些開發者懂得極少這些東西。不管如何,這無符號整型問題的答
 案是輸出是“>6” 。原因是當表達式中存在有符號類型和無符號類型時所有
 的數都自動轉換為無符號類型。因此-20 變成了一個非常大的正整數,所
 以該表達式計算出的結果大于6 。這一點對于應當頻繁用到無符號數據類
 型的嵌入式系統來說是豐常重要的。如果你答錯了這個問題,你也就到了
 得不到這份工作的邊緣。
74、評價下面的代碼片斷:
 unsigned int zero = 0;
 unsigned int compzero = 0xFFFF;
 /*1‘s complement of zero */
 【參考答案】對于一個int型不是16位的處理器為說,上面的代碼是不正
 確的。應編寫如下:
 unsigned int compzero = ~0;
 這一問題真正能揭露出應試者是否懂得處理器字長的重要性。在我的經
 驗里,好的嵌入式程序員非常準確地明白硬件的細節和它的局限,然而
 PC機程序往往把硬件作為一個無法避免的煩惱。
 到了這個階段,應試者或者完全垂頭喪氣了或者信心滿滿志在必得。如
 果顯然應試者不是很好,那么這個測試就在這里結束了。但如果顯然應
 試者做得不錯,那么我就扔出下面的追加問題,這些問題是比較難的,
 我想僅僅非常優秀的應試者能做得不錯。提出這些問題,我希望更多看
 到應試者應付問題的方法,而不是答案。不管如何,你就當是這個娛樂
 吧…
75、下面的代碼片段的輸出是什么,為什么?
 char *ptr;
 if ((ptr = (char *)malloc(0)) == NULL)
 puts(“Gota null pointer”);
 else
 puts(“Gota valid pointer”);
 【參考答案】這個你可以先大膽猜測下,然后再用你的
 編譯器嘗試著編譯下~~
 100 條經典 C語言筆試題目
 歡迎進入C語言程序筆試面試,編寫程序代碼單元。
76、編寫strcpy 函數
 已知strcpy 函數的原型是 char *strcpy(char *strDest,
 const char *strSrc);其中strDest是目的字符串,
 strSrc 是源字符串。
 (1)不調用C++/C 的字符串庫函數,請編寫函數
 strcpy 。
 (2)strcpy 能把 strSrc 的內容復制到strDest,為什
 么還要char * 類型的返回值?
77、寫出二分查找的代碼。
 【參考答案】 int b inary_search(int* arr, int k ey, int n)
 {
 int low = 0;
 int h igh = n - 1 ;
 int m id;
 while (low <= high)
 {
 mid = (high + low) / 2;
 if (arr[mid] > k)
 high = mid -1 ;
 else if (arr[mid] < k)
 low = mid + 1;
 else
 return mid;
 }
 return -1;
 }
78、請編寫一個C 函數,該函數給出一個字節中被置
 1 的位的個數。
 【參考答案】
 unsigned int T estAsOne0(char log)
 {
 int i;
 unsigned int num=0, val;
 for(i=0; i<8; i++)
 {
 va l = log >> i; // 移位
 val & = 0x01; // 與1 相與
 if(val)
 num++;
 }
 return num;
 }
79、請編寫一個C 函數,該函數將給定的一個字符串
 轉換成整數。
 【參考答案】
 int Invert(char* str)
 {
 int num =0;
 while(*str!=’\0’)
 {
 int d igital=str-48;
 num=num10+digital;
 str=str+1;
 }
 return num;
 }
80、請編寫一個C 函數,該函數將給定的一個整數轉
 換成字符串。
 【參考答案】
 void IntToCharChange(int num, char* pval)
 {
 char strval[100];
 int i , j;
 int val0 = 0;
 int val1 = 0;
 val0 = num;
 for(i=0; i<100; i++)
 {
 val1 = val0 % 10; //取余
 val0 = val0 / 10; // 取整
 strval[i] = val1 + 48; // 數字—字符
 if(val0 < 10)
 {
 i++;
 strval[i] = val0 + 48;
 break;
 }
 }
 for(j=0; j<=i; j++) // 倒置
 pval[j] = strval[i-j];
 pval[j] = ‘\0’;
 }
81、實現strcmp 函數。
 【參考答案】
 int m ystrcmp(const c har* str1, const char* str2)
 {
 assert((str1 != NULL) && (str2 != NULL));
 int r et = 0;
 while (!(ret = (unsigned char)str1 - * (unsigned char*)str2) && *str2)
 {
 str1++;
 str2++;
 }
 if (ret > 0)
 ret = 1;
 else if (ret < 0)
 ret = -1;
 return ret;
 }
82、請編寫一個C 函數,該函數將一個字符串逆序。
 【參考答案】
 void AntitoneValue(cha r* father, char* child)
 {
 int i ;
 char source[100];
 int j = 0;
 while(father[j]) //放入source ,[j] 為長度
 {
 source[j] = father[j];
 j++;
 if(j > 99)
 return;
 }
 source[j] = ‘\0’;
 for(i=0; i<j; i++)
 child[i] = source[j-i-1]; // 反序
 child[i] = ‘\0’;
 }
83、請編寫一個C 函數,該函數在給定的內存區域搜
 索給定的字符,并返回該字符所在位置索引值。
 【參考答案】
 int s earch(char* cpSource, intn , char ch) // 起始地址,搜索長度,目標字符
 {
 int i;
 for(i=0; i<n && *(cpSource+i) != ch; ++i);
 return i;
 }
84、請編寫一個C 函數,該函數在一個字符串中找到
 可能的最長的子字符串,該字符串是由同一字符組成
 的。
 【參考答案】
 int C hildString(char*p) // 自己寫
 {
 char q =p;
 int s tringlen=0, i=0,j=1,len=0,maxlen=1;
 while(q!=’\0’) //不能用strlen, 求得長度stringlen
 {
 Stringlen++;
 q++;
 }
 while( i< String len )
 {
 if((p+i)==(p+j)& & j< St ri ngle n )
 {
 len++; // 統計子串長度
 i++;
 j++;
 }
 else
 {
 if(len>maxlen) // 統計最大子串長度
 {
 maxlen=len+1;
 len=0;
 }
 else
 len=0;
 i++;
 j++;
 }
 }
 retu rn ma xlen;
 }
85、華為面試題:怎么判斷鏈表中是否有環?
 【參考答案】答:用兩個指針來遍歷這個單向鏈表,第
 一個指針p1,每次走一步;第二個指針p2,每次走兩
 步;當p2 指針追上p1的時候,就表明鏈表當中有環
 路了。
 int testLinkRing(Link *head)
 {
 Link *t1=head,*t2=head;
 while( t1->next && t2->next)
 {
 t1 = t1->next;
 if (NULL == (t2 = t2->next->next))
 return 0; // 無環
 if (t1 == t2)
 return 1;
 }
 return 0;
 }
86、有一浮點型數組A, 用C 語言寫一函數實現對浮點
 數組A進行降序排序,并輸出結果,要求要以數組A 作為
 函數的入口.( 建議用冒泡排序法)
 【參考答案】
 void BubbleSort(double a rr[], int n)
 {
 int i,j ;
 int e xchange = 1 ;// 交換標志
 for(i=1;i<n;i++)
 { // 最多做n-1趟排序
 exchange=0 ;// 本趟排序開始前,交換標志應為假
 for(j=n-1;j>=i ;j–) //對當前無序區R[i…n]自下向上掃描
 if(arr[j+1] > arr [ j])
 {// 交換記錄
 arr[0]=arr[j+1];//R[0]不是哨兵,僅做暫存單元
 arr[j+1]=arr[j];
 arr[j]=arr[0];
 exchange=1 ;// 發生了交換,故將交換標志置為真
 }
 if(!exchange) // 本趟排序未發生交換,提前終止算法
 return ;
 } //endfor(外循環)
 }
87、實現雙向鏈表刪除一個節點P,在節點P 后插入一
 個節點,寫出這兩個函數。
 【參考答案】
 // 刪除操作
 Status ListDelete_DuL(DuLinkList &L,inti,Ele mType &e)
 {
 if(!(p=G e tElemP_DuL(L,i))) return ERROR;
 e=p->data;
 p->prior->next=p->next;
 p->next->prior=p->pror;
 free§;
 return OK;
 }
 // 插入操作
 Status ListInsert_DuL(DuLinkList &L,inti,ElemType &e)
 {
 if(!(p=G e tElemP_DuL(L,i)))
 return ERROR;
 if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
 return ERROR;
 s->data=e;
 s->pri or =p;
 p-> next -> prior =s;
 p->next=s;
 s->next=p->next->next;
 return OK;
 }
88、把一個鏈表反向。
 【參考答案】從第一個元素開始,ps指向他,將他(
 ps)指向頭節點(ps->next = head) ,將ps設為頭節點
 (head = ps; )操作下一個元素(ps= pe->next;)等
 于是依次將每個元素翻到原頭節點前面。
 void reverse(test* head)
 {
 test* pe = head;
 test* ps = head->next;
 while(ps)
 {
 pe->next = ps->next;
 ps->next = head;
 head = ps;
 ps = pe->next;
 }
 }
89、將二維數組行列元素互換,存到另一個數組中。
 【參考答案】
 #include <stdio.h>
 main()
 { int a [2][3]={{1,2,3},{4,5,6}};
 int b[3][2],i,j;
 printf(“array a :\n”);
 for(i=0;i<=1;i++)
 { for(j=0;j<=2;j++)
 { printf("%5d",a[i][j]);
 b[j][i]=a[i][j];
 }
 printf("\n");
 }
 printf(“array b :\n”);
 for(i=0;i<=2;i++)
 { for(j=0;j<=1;j++)
 printf("%5d",b[i][j]);
 printf("\n");
 }
 }
90、輸入一行字符,統計其中有多少個單詞。
 【參考答案】
 #include <stdio.h>
 main()
 {
 char str i ng[81];
 int i,num=0,word=0;
 char c;
 gets(string);
 for(i=0;(c=string[i])!=’\0’;i++)
 if(c==’ ')
 word=0;
 else if(word==0)
 {
 word=1; num++; }
 printf(“There are %d word s in the line\n”,num);
 }
91、寫一個內存拷貝函數,不用任何庫函數.就是前些時
 候本版討論的那個問題。
 【參考答案】
 void* m e mcpy(void* pvTo, const void* pvFrom, size_t size)
 {
 assert((pvTo != NULL) && (pvFrom ! = NULL));
 byte* pbTo= pvTo;
 byte* pbFrom = pbFrom;
 while (size-- > 0)
 {
 *pbTo++ = *pbFrom++;
 }
 return pvTo;
 }
92、有1、2、3 、4個數字,能組成多少個互不相同且
 無重復數字的三位數?都是多少?
 【參考答案】
 #inc lude “stdio.h”
 #include “conio.h”
 main()
 {
 int i,j,k;
 printf("\n");
 for(i=1;i<5;i++) /* 以下為三重循環*/
 for(j=1;j<5;j++)
 for (k=1;k<5;k++)
 {
 if (i!=k&&i!=j&&j!=k) /* 確保i、j、k三位互不相同*/
 pr intf("%d,%d,%d\n",i,j,k);
 }
 getch();
 }
93、取一個整數a從右端開始的4~7位。
 【參考答案】
 main()
 {
 unsigned a,b,c,d;
 scanf("%o",&a);
 b=a>>4;
 c=(0<<4);
 d=b&c;
 printf("%o\n%o\n",a,d);
}
94、打印出楊輝三角形(要求打印出10行如下圖)。
 【參考答案】
 main()
 {
 int i,j;
 int a [10][10];
 printf("\n");
 for(i=0;i<10;i++)
 {
 a[i][0]=1;
 a[i][i]=1;
 }
 for(i=2;i<10;i++)
 for(j=1;j<i;j++)
 a[i][j]=a[i-1][j-1]+a[i-1][j];
 for(i=0;i<10;i++)
 {
 for(j=0;j<=i;j++)
 printf("%5d",a[i][j]);
 printf("\n");
 }
 getch();
 }
95、實現strcmp 函數。
 100 條經典 C語言筆試題目
 96、寫一個函數,求一個字符串的長度,在main函數
 中輸入字符串,并輸出其長度。
 【參考答案】
 main()
 {
 intlen;
 char *s tr[20];
 printf(“please input a string:\n”);
 scanf("%s",str);
 len=length(str);
 printf(“the s tring has %d characters.”,len);
 getch();
 }
 length§
 char *p;
 {
 int n ;
 n=0;
 while(*p!=’\0’)
 {
 n++;
 p++;
 }
 return n;
 }
97、809*??=800*??+9*??+1 其中??代表的兩位數
 ,8*?? 的結果為兩位數,9*??的結果為3位數。求??代
 表的兩位數,及809*??后的結果。
 【參考答案】output(long b,long i)
 {
 printf("\n%ld/%ld=809*%ld+%ld",b,i,i,b%i);
 }
 main()
 {
 long int a ,b,i;
 a=809;
 for(i=10;i<100;i++)
 {
 b=ia+1;
 if(b>=1000&&b<=10000&&8i<100&&9*i>=100)
 output(b,i);
 }
 getch();
 }
98、某個公司采用公用電話傳遞數據,數據是四位的整數,在
 傳遞過程中是加密的,加密規則如下:每位數字都加上5, 然后
 用和除以10的余數代替該數字,再將第一位和第四位交換,第
 二位和第三位交換。
 【參考答案】
 main()
 {
 int a ,i,aa[4],t;
 scanf( " % d " ,&a) ;
 aa[0]=a %10;
 aa[1]=a %100/10;
 aa[2]=a %1000/100;
 aa[3]=a /1000;
 for(i=0 ; i<=3 ;i++)
 {
 aa [i]+=5;
 aa[i] %=10;
 }
 for(i=0;i<=3/2;i++)
 {
 t=aa[i];
 aa[i]= aa[3- i];
 aa[3- i]= t ;
 }
 for(i=3;i>=0;i–)
 prin tf("% d ", a [i]);
 getch();
 }
99、計算字符串中子串出現的次數。
 【參考答案】
 main()
 {
 char str1[20],str2[20],*p1,*p2;
 int sum=0;
 printf(“please input two strings\n”);
 scanf("%s%s",str1,str2);
 p1=str1;p2=str2;
 while(*p1!=’\0’)
 {
 if(*p1==*p2)
 {
 while(*p1==*p2&&*p2!=’\0’)
 {
 p1++;
 p2++;
 }
 }
 else
 p1++;
 if(*p2==’\0’)
 sum++;
 p2=str2;
 }
 printf("%d",sum);
 getch();
 }
100 、有兩個磁盤文件A和B, 各存放一行字母,要求把
 這兩個文件中的信息合并(按字母順序排列),輸出
 到一個新文件C 中。
 【參考答案】
 100 條經典 C語言筆試題目
 main()
 {
 FILE *fp;
 in t i,j,n,ni;
 char c[160],t,ch;
 if((fp=fopen(“A”,“r “))==NULL)
 {
 printf(“file A cannot be opened\n”);exit(0);
 }
 printf(”\nA contents are :\n”);
 for(i=0;(ch=fgetc(fp))!=EOF ; i++)
 {
 c[i]=ch;pu tchar(c[i]);
 }
 fclose(fp);
 ni=i;
 if((fp=fopen(“B”,“r “))==NULL)
 {
 printf(“file B cannot be opened\n”);exit(0);
 }
 printf(”\nB contents are :\n”);
 for(i=0;(ch=fgetc(fp))!=EOF ; i++)
 {
 c[i]=ch;pu tchar(c[i]);
 }
 fclose(fp);
 n=i;
 for(i=0;i<n;i++)
 for(j=i+1;j<n;j++)
 if(c[i]>c[j]){t=c[i ];c[i]=c[j];c[j]=t;}
 printf("\nC file is:\n");
 fp =f open(“C”,“w”);
 for(i=0;i<n;i++){putc(c[i ],fp);putchar(c[i]);}
 fclose(fp);
 getch();
 }
總結
以上是生活随笔為你收集整理的100条经典C笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: python编程格式化输出_Python
- 下一篇: mysql安装包脚本之家_CentOS
