C/C++題目--strcpy函數

題目:以下代碼是否正確?

char a[4],b[]={"COPY"};
strcpy(a,b);

參考答案

錯誤。因爲把原字符串b賦值給字符串a時,b的長度包括了\0爲結束符,算是一個字符,共5個字符,而a長度只爲4。所以b長度大於a的長度時,不能把b拷貝到a數組當中,否則運行時就會崩潰。

題目:以下代碼是否正確?

char a[5];
char *b=”copy”;
strcpy(a,b);    

參考答案 

正確。

題目:以下代碼是否正確? 

char *a=”hello world”;
char b[]={"COPY"};
strcpy(a,b);

參考答案

錯誤的。因爲a作爲指針指向的是字符串常量地址,而該常量是無法被修改的,因此複製給a指向的內容時,程序就會崩潰。

題目:如果我可以寫

char a[]=”Hello, world”:

那爲什麼不能寫

char a[14];

a=”Hello, world”;

參考答案

字符串是數組,而不能直接對數組賦值。可以使用strcpy()代替:

strcpy(a,”Hello, world!”);

strncpy問題

題目:strcpystrncpy的區別?

參考答案

strcpy只是複製字符串,但不限制複製的數量,很容易造成緩衝一處。strncpy安全一些。

代碼1 

         char *p="are you ok";
         char *name="yes fine mi fans";
         strcpy(name,p);
         cout<<name<<endl;;
         strncpy(name,p,sizeof(name));

代碼2 

         char name[]="helloworld",dest[20]={0};
         strncpy(dest,name,5);//只複製前5個字符,即hello

題目:請實現strcpy函數。

【參考答案】

答案1:(自己的思路和網上的答案差不多) 

char * strcpy( char *strDest, const char *strSrc )
{

 //第1種.assert( (strDest != NULL) && (strSrc != NULL) );
 if(strDest==NULL ||strSrc == NULL )//第2種
          throw "非法操作";
 char *address = strDest;
 while((*strDest++=*strSrc++) !='\0');
 return address;
}
int main()
{
char a[10],b[]="hello";
strcpy(a,b);
cout<<a<<endl;  
return 0;
}

答案2:(來自《經典C面試真題精講》)

對於複製字符串問題而考慮的因素如下(優解函數,以下是原文的部分內容):

(1)對輸入參數的合法性檢測:如果參數dest或src指針有一個是空指針(指針等於NULL),那麼就無法完成字符串複製的工作,所以應該提前退出,不應該繼續執行。

 

 
 


(2)內存區域重疊:雖然內存重疊這種現象在系統內存日趨海量的情況下出現的機率很小,但並不能保證就不會出現,而這種情況的出現,對系統或產品帶來的問題是嚴重的,並且難以快速定位。筆者在多年實際項目開發中就遇到過類似問題,爲此問題也付出過慘重代價。對於該題目,內存區域的劃分無非就是圖1-5、圖1-6、圖1-7中所列出的3種類型,當內存區域爲圖1-5或圖1-6時,對於字符串從src區域複製到dest區域是完全可以通過上述代碼實現的。但如果內存區域是圖1-7的情況時,如果按照上述代碼實現,那麼肯定會出現內存重疊,也就是說當複製到一定程度時,之前複製過的字符串會被後面複製的字符串覆蓋。對於圖1-7這種情況,我們就必須採取其他辦法來實現字符串的正確複製。細心的讀者也許已經想到,我們可以從src指向字符串的最後一個字符開始複製,即從後往前進行復制,這樣就不會出現之前複製的字符在後面複製中被覆蓋的情況。注意:這種情況下src指向的字符串部分或全部內容被覆蓋。

 

#include<assert.h>
char *mystrcpy(char *dest,char *src)
{    
    char *d=dest;
    char *s=src;
    int count=0;
    assert(dest);
    assert(src);
    if(src==dest)
      return src;
    count=strlen(src)+1;
    if(count<=1)
      return 0;
    if(dest<src||dest>=(src+count))
  {
        while(count--)
        *d++=*s++;
  }
else
  {
        d=dest+count;
         s=src+count;
         while(count--)
          {
         *d--=*s--;
         }
   }
return dest;
}
int main()
{
     char a[20];
     char *b="hello";
     mystrcpy(a,b);
     cout<<a<<endl;
     return 0;
}

 

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