找工作_筆試_C_01

上網搜索一些好的C筆試題,收藏了,感謝原作者:

1. C,C++經典筆試題(答案)

2. strcpy的寫法:

(1)[精華] 出現頻率最高的筆試題strcpy寫法

char * strcpy(char * strDest,const char * strSrc)
        {
                if ((strDest==NULL)||(strSrc==NULL)) //[1]
                        throw "Invalid argument(s)"; //[2]

                char * strDestCopy=strDest;   //[3]                

while ((*strDest++=*strSrc++)!='\0'); //[4]                

return strDestCopy;
        }

(2) C/C++——strcpy函數的實現 和解析

char *strcpy(char *strDest, const char *strSrc)
{
    assert((strDest!=NULL) && (strSrc !=NULL));    // 2分
    char *address = strDest;                                    // 2分
    while( (*strDest++ = * strSrc++) != '\0' )        
    // 2分只有當*ch1 = '\0'的時候纔會退出循環
              NULL ; 
    return address ;                                                  
  
// 2分
}

strcpy能把strSrc的內容複製到strDest,爲什麼還要char * 類型的返回值?
答:爲了實現鏈式表達式。                                         // 2分
例如       int length = strlen( strcpy( strDest, “hello world”) );


char* strcpy1(char *strDest, const char* strSrc)
{
        assert(strSrc != NULL );
        assert(strDest != NULL);
        int i;
        char *address = strDest;
 
    for(i = 0; strSrc[i] != '\0'; i++)
              strDest[i] = strSrc[i];
       strDest[i] = '\0';
 
        return address;
}

3. strcpy的寫法:

(1) strlen和sizeof的區別

sizeof(...)是運算符, 在頭文件中typedef爲unsigned int,其值在編譯時即計算好了,參數可以是數組、指針、類型、對象、函數等。strlen(...)是函數,要在運行時才能計算。參數必須是字符型指針(char*), 且必須是以'\0'結尾的。

char str[20]="0123456789"; 
int a=strlen(str); //a=10; 
int b=sizeof(str); //而b=20; 

附1: 複製時大小注意!

     

// String的普通構造函數  

        String::String(const char *str)       // 6分
{
   
 if(str==NULL)    
     
{
       
m_data = new char[1];     // 若能加 NULL 判斷則更好
       
*m_data = ‘ 0’;  
     
}
     
else
     
{
       
int length = strlen(str);  

// char *m_data;
       
m_data = new char[length+1];   // 若能加 NULL 判斷則更好    

       
strcpy(m_data, str);
     
}
}


4. memcpy的寫法

(1) 筆試題02-自己實現memcpy 

void *myMemCopy(void *dest,const void *src,size_t count)
{
    char *pDest=(char *)(dest);
    const char *pSrc=(const char *)(src);


    //目的地址和源地址重疊,從源地址的末尾方向開始拷貝
     if( pDest>pSrc && pDest<pSrc+count )
    {
        pDest = pDest + count-1;
        pSrc = pSrc + count-1;
        while(count--){
            *pDest-- = *pSrc--;
        }
    }
    //目的地址和源地址不重疊,從源地址的開始方向拷貝
    else
    {
        while(count--){
              *pDest++ = *pSrc++;
        }
    }

    return pDest;
}

(2) 【面試題】實現memcpy函數

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章