高效面試之實現strcpy等簡單庫函式

2021-06-26 13:55:11 字數 3436 閱讀 3775

atoi,

itoa

strcpy,

strstr,

strcmp

memcpy,memove,

memset

1.itoa 

注意:字串倒置

char* itoa(int a,char* string)

i=0;

j--;

while(j>=0)

string[i++]=temp[j--];

string[i]='

\0';

return string;

}
/* 實現itoa函式的源** */ 

char *myitoa(int num,char *str,int radix)

else unum=(unsigned)num; /* 其他情況 */

/* 逆序 */

do while(unum);

str[i]='\0';

/* 轉換 */

if(str[0]=='-') k=1; /* 十進位制負數 */

else k=0;

/* 將原來的「/2」改為「/2.0」,保證當num在16~255之間,radix等於16時,也能得到正確結果 */

char temp;

for(j=k;j<=(i-k-1)/2.0;j++)

return str;

}

2.atoi

注意:判斷正負

int atoi(char* s)

3.strcpy

原型char* strcpy(char *dest,const char *src);

實現char* strcpy(char *dest,const char *src)

/*while( (*dest++=*src++)!='\0'); //更加簡潔

*/return temp;

}注意:

錯誤的做法:

1.不檢查指標的有效性,說明答題者不注重**的健壯性。

2.return new string("invalid argument(s)")

;,說明答題者根本不知道返回值的用途,並且他對記憶體洩漏也沒有警惕心。從函式中

返回函式體內分配的記憶體是十分危險的做法

,他把釋放記憶體的義務拋給不知情的呼叫者,絕大多數情況下,呼叫者不會釋放記憶體,

這導致記憶體洩漏。

3.迴圈寫成

while(*strsrc!='\0') *strdest++=*strsrc++

;,說明答題者對邊界條件的檢查不力。迴圈體結束後,

strdest

字串的末尾沒有正確地加上

'\0'。

4.strstr

原型:char *strstr(const char* s1,const char* s2)

return null;

}注意:

1.注意判斷s2為空的情況

2.使用strncmp來做判斷

3.for ( ; *s1; ++s1 )和for ( ; *s1; s1++)有區別嗎?在這裡沒有區別,

++s1 和 s1++ 在賦值表示式中才有區別,單獨使用的時候沒有區別

5.strcmp

原型: int strcmp(constchar *s1,const char * s2);

當s1時,返回值

=-1

當s1==s2時,返回值=0

當s1>s2時,返回值=1

注:c++ 中

當s1時,返回值小於0

當s1==s2時,返回值等於0

當s1>s2時,返回值大於0

即:兩個字串自左向右逐個字元相比(按ascii值大小相比較),直到出現不同的字元或遇'\0'為止。

6.memcpy說明

1.source和destin所指的記憶體區域可以重疊,但是如果source和destin所指的記憶體區域重疊,那麼這個函式並不能夠確保source所在重疊區域在拷貝之前被覆蓋。而使用

memmove

可以用來處理重疊區域。函式返回指向destin的指標。

2.strcpy和memcpy主要有以下3方面的區別。

2.1、複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。

2.2、複製的方法不同。strcpy不需要指定長度,它遇到被複製字元的串結束符"\0"才結束,所以容易溢位。memcpy則是根據其第3個引數決定複製的長度。

2.3、用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy

3.如果目標陣列destin本身已有資料,執行memcpy()後,將覆蓋原有資料(最多覆蓋n)。如果要追加資料,則每次執行memcpy後,要將目標陣列位址增加到你要追加資料的位址。

linux中實現:

void* memcpy(void *dest, const void *src, size_t count)

注意:1.判斷結束條件為while(count--)即複製count個位元組

2.引數都為void *型別,

3.在進行複製之前,為了保證按乙個位元組定址,把void進行型別轉換為char型

7.memmove

當源記憶體和目標記憶體存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。

memmove的處理措施:

(1)當源記憶體的首位址等於目標記憶體的首位址時,不進行任何拷貝

(2)當源記憶體的首位址大於目標記憶體的首位址時,實行正向拷貝

(3)當源記憶體的首位址小於目標記憶體的首位址時,實

行反向拷貝

void * memmove(void* dest,void* src,size_t count)

if(d>s)//反向拷貝

return dest; }

8.memset

原型: void *memset(void *buffer, int c, int count);

用法:#include

功能:把buffer所指記憶體區域的前count個位元組設定成字元c。

說明:返回指向buffer的指標。

原始碼實現:

void *memset(void *src, int c, size_t count)

注意:1.和前面一樣,assert判斷src是否為空

2.型別轉換void轉char

編寫乙個函式,把乙個char組成的字串迴圈右移n位

思路1:

void loopmove(char temp,int n)

temp[0]=c;}}

思路2:

void loopmove(char*pstr,int steps)

面試 strcpy的實現

題目 已知strcpy函式的原型是 char strcpy char strdest,const char strsrc 1.不呼叫庫函式,實現strcpy函式。2.解釋為什麼要返回char 解說 1.strcpy的實現 char strcpy char strdest,const char str...

面試題 自己實現strcpy 函式

經常看到需要自己實現字串拷貝函式,網上也有很多博文,但是很多實現都是忽略了一些問題。具體看 分析。include include using namespace std 這個寫法是比較常見的寫法,但是這樣處理記憶體重疊情況會崩潰 char mystrcpy char des,const char s...

高效面試之各種排序演算法c實現

author cqkxboy168 date 2014 8 4 include include bitmap使用 define max 200 int map 1 max 32 void swap int a,int b 選擇排序 原理 無序 每一次迴圈從 無序 裡面select乙個最小的元素。vo...