c語言筆試題(帶答案)
c語言筆試題目
填空:
1,short int a[10]={123, 456, 789}; sizeof(a)= 20 ;short int *p=&a, 則sizeof(p)= 8
對于64位機來說,指針為8位元組表示。其中
sizeof是一運算符,傳回編譯器為其配置設定的數組空間大小,不關心裡面存了多少資料,sizeof幾種情況:
數組——編譯時配置設定的數組空間大小;
指針——存儲該指針所用的空間大小(存儲該指針的位址的長度, 是長整型);
類型——該類型所占的空間大小;
對象——對象的實際占用空間大小;
函數——函數的傳回類型所占的空間大小。函數的傳回類型不能 是void。
strlen是一函數,隻接受char*類型變量,傳回字元串的實際長度。該字元串可能是自己定義的,也可能是記憶體中随機的,該函數實際完成的功能是從代表該字元串的第一個位址開始周遊,直到遇到結束符\'\0\',傳回的長度大小不包括\'\0\'。
詳細參考:strlen和sizeof的差別
2,給一整形變量n(32bit),把n的bit5(bit0開始)置1,其他不變:n |= (1<<5)
位操作之中時常用到與(&),或異(^),或(|),其中:
(1)與1相異或(^)運算将取反
(2)與1相或(|)運算将被置1
(3)與1相與(&)運算将保持不變
(4)取反運算符~,将數0-->1,1-->0
(5)右移(>>) 左移(<<)
3,int fun(int* x, int *y){……} 則:怎麼用函數指針p調用fun?
void main()
{ int a=1,
b=2;
int
(*p)(int *, int *);
p=fun; p(&a, &b);
}
函數指針,本質是指針,表示為 int (*p)(int *, int *)
指針函數,本質是函數,表示為 int *p(int *, int *)
4,定義一個宏,将記憶體的大小由MB轉換為bit:#define
MB_TO_BIT(x) ((x)*1024*1024)ul
5,如圖,p,q節點指向,插入q,則:

viod add(node* head, int a)
{ …
node *p = head->next;
node *q = (node *)malloc(sizeof(node));
q->data = a;
q->next = p->next;
p->next=q;
}
技巧是不能夠把p和後一節點先斷開,否則将不能尋找到後一節點。
6,由char a=253; int b = a; int c = a&0xff; 則:b=-3 , c=253 ;
其中:a為有符号數,最高位是1,餘下7位,範圍-128~127,253表示為-3
7,用define實作,将整數x,y連接配接形成整數并除以y,如:F(12, 34, 56) = 1234/56,則:#define F(x,y,z) ((x)##(y)/(z));
注意:宏之中’#’ ‘##’差別,
(1)‘#’是把宏參數轉換為字元串,如:
#define PSQR(x) printf(“ ”#x”=%d\n ”, ((x)*(x)))
則 y=5,PSQR(y)将輸出 y=25;
x=2+4, PSQR(x)将輸出 2+4=36
(2)’##’粘合劑,如:
#define XNAME(n) x##(n) 則
XNAME(4)将表示為 x4
選擇:
1,找不正确選擇(A)
A, char a[8]={‘a’,’b’,’c’,} B, char a[8]; a=”hello”;
C, char a[]=”abc”; D, char a[8]={’a’,’b’,’c’,’\0’};
2,#define M(x, y, z) x*y+z, 則a=1, b=2, c=3結果輸出
M(a+b, b+c, c+a)= (D)
A, 19 B,17 C,15 D,12
宏隻是簡單的替換,不會計算出a+b, b+c, c+a中的結果。是以M(a+b, b+c, c+a)=1+2*2+3+3+1。
需要改進為:#define M(x, y, z) ((x)*(y)+(z))
3,由char aa=500; int bb=aa;則 printf(“%d\n”, bb+1)的結果(C)
A, 編譯報錯 B,245 C,-11 D,-1
由于char類型表示範圍為-128~127,是以aa值為-12,是以bb+1=-11
4,char a[] = {’i’, ’n’, ’n’, ’\0’, ’s’}; char b[] = {’i’, ’n’, ’n’, ’s’ ,’\0’};
int x1=sizeof(a), int x2=strlen(a), int x3=sizeof(b), int x4=strlen(b)
問:X1= X2= X3= X4= ;(A)
A,5 3 5 4 B,5 5 5 5 C,5 5 6 5 D,3 3 5 5
sizeof計算出編譯器為數組配置設定記憶體大小,strlen接受char*類型變量,遇到’\0’結束,計算資料實際存儲的資料。
詳細參考:strlen和sizeof的差別
5,函數遞歸,求f(2, 3)= D
int f(int x, int y)
{
if(x==0) return y+2;
if(y==0) return f(x-1, 1);
return f(x-1, f(x, y-1));
}
A,4 B,16 C, 31 D,61
5, 下列程式可能運作結果()(多選)
#include <stdio.h>
#include <unistd.h>
int main (int argc, char **argv)
{
int cnt=2;
pid_t pid;
if((pid=fork())==0)
cnt++;
else
cnt--;
printf("\n%d\n", cnt);
return 0;
} /* ----- End of main() ----- */
A,3 B,31 C,1 D,13
結果:A和C
簡答:
1,用c變函數,實作一個字元高低位互換,比如0x3A-->0xA3
char change (char num)
{
char temp=num;
temp &= 0x0f;
temp = temp<<4;
num &= 0xf0;
num = num>>4;
temp = (num|temp);
return temp;
} /* ----- End of change() ----- */
2,字元逆序存儲,如abcdefgh->hgfedcba
char *reverse (char *s)
{
char *head = s;
char *end = s;
/*end定位到字元串尾*/
#if 1
while (*(end + 1) != \'\0\')
++end ;
#else
while( *end )
++end;
end--;
#endif
while(end > head)
{
char temp=*head;
*head++ = *end;
*end-- = temp;
}
return s;
} /* ----- End of reverse() ----- */
詳細參考:字元串面試題(一)字元串逆序
3,字元串s,t, 将t插入s,其中假設s有足夠空間容納t
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 100
int insert_pos (char *src, char *dst, int pos)
{
char temp[MAX];
int loc=stlren(src);
if(pos < 0)
{
printf("position needs to big than or equal to 0\n");
return -1;
}
/* 插入位置超過被插位元組串長度 */
if(loc<=pos)
{
strcat(src, dst);
}
/*正常插入字元串中間*/
else
{
memset(temp, 0, 100);
strcpy(temp, src+pos);
strcpy(src+pos, dst);
strcat(src, temp);
}
return 0;
} /* ----- End of insert_pos() ----- */
int main (int argc, char **argv)
{
char a[]="abghij";
char b[]="cdef";
int pos;
printf("position:\n");
scanf("%d", &pos);
if( -1==insert_pos(a, b, -1) )
return -1;
printf("%s\n", a);
return 0;
} /* ----- End of main() ----- */
4,單連結清單L,頭指針為phead,判斷其是否有環?
bool isExitsLoop(list *head)
{
list *slow = head, *fast = head;
while ( fast && fast->next )
{
slow = slow->next;
fast = fast->next->next;
if ( slow == fast ) break;
}
return !(fast == NULL || fast->next == NULL);
}
詳細參考:判斷單連結清單是否存在環及求環入口點