天天看點

c語言筆試題(帶答案) - 小猩

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,則: 

c語言筆試題(帶答案) - 小猩
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);
}      

詳細參考:判斷單連結清單是否存在環及求環入口點