常見函式實現

2021-09-05 18:51:38 字數 2942 閱讀 2529

(1 ) strlen()的c語言實現(不能使用任何變數...)

***************

strlen的幾種不同實現方法

第一種方法:

int strlen(const char *str)

return len;}

第二種方法:

int strlen(const char *str)

第三種方法:

int strlen(const char* str)

else

}strcpy函式-軟體工程師面試常考的一道題

編寫strcpy 函式

已知strcpy 函式的原型是

char *strcpy(char *strdest, const char *strsrc);

其中strdest 是目的字串,strsrc 是源字串。

(1)不呼叫c++/c 的字串庫函式,請編寫函式 strcpy

char *strcpy(char *strdest, const char *strsrc);

(2)strcpy 能把strsrc 的內容複製到strdest,為什麼還要char * 型別的返回值?

答:為了實現鏈式表示式。

例如 int length = strlen( strcpy( strdest, 「hello world」) );

測試用:( 編譯: gcc strcpy.c -wall -g  執行: a.out  abcdef   結果: the string is: abcdef)

#include

#include

#include

char *strcpy1(char *str_dest, const char *str_src);

int main(int argc, char **argv)

char *strcpy1(char *str_dst, const char *str_src)

return address;

}補充:

1、布林變數與零值比較

??  不可將布林變數直接與true、false 或者1、0 進行比較。根據布林型別的語義,零值為「假」(記為false),任何非零值都是「真」(記為true)。true 的值究竟是什麼並沒有統一的標準。例如visual c++ 將true 定義為

1,而visual basic 則將true 定義為-1。假設布林變數名字為flag,它與零值比較的標準if 語句如下:

if (flag) // 表示flag 為真if (!flag) // 表示flag 為假

其它的用法都屬於不良風格,例如:

if (flag == true)

if (flag == 1 )

if (flag == false)

if (flag == 0)

2、整型變數與零值比較

??  應當將整型變數用「==」或「!=」直接與0 比較。假設整型變數的名字為value,它與零值比較的標準if 語句如下:

if (value == 0)

if (value != 0)

不可模仿布林變數的風格而寫成

if (value) // 會讓人誤解 value 是布林變數

if (!value)

3、浮點變數與零值比較

??  不可將浮點變數用「==」或「!=」與任何數字比較。千萬要留意,無論是float 還是double 型別的變數,都有精度限制。所以一定要避免將浮點變數用「==」或「!=」與數字比較,應該設法轉化成「>=」或「<=」形式。

假設浮點變數的名字為x,應當將

if (x == 0.0) // 隱含錯誤的比較

轉化為if ((x>=-epsinon) && (x<=epsinon))

其中epsinon 是允許的誤差(即精度)。

4、指標變數與零值比較

??  應當將指標變數用「==」或「!=」與null 比較。指標變數的零值是「空」(記為null)。儘管null 的值與0 相同,但是兩者意義不同。假設指標變數的名字為p,它與零值比較的標準if 語句如下:

if (p == null) // p 與null 顯式比較,強調p 是指標變數

if (p != null)

不要寫成

if (p == 0) // 容易讓人誤解p 是整型變數

if (p != 0)

或者if (p) // 容易讓人誤解p 是布林變數

if (!p)

有時候我們可能會看到 if (null == p) 這樣古怪的格式。不是程式寫錯了,是程

序員為了防止將 if (p == null) 誤寫成 if (p = null),而有意把p 和null 顛倒。

編譯器認為 if (p = null) 是合法的,但是會指出 if (null = p)是錯誤的,因為null

不能被賦值。

5、for迴圈效率

在多重迴圈中,如果有可能,應當將最長的迴圈放在最內層,最短的

迴圈放在最外層,以減少cpu 跨切迴圈層的次數。例如示例(b)的效率比示例

(a)的高。

for (row=0; row<100; row++)

}(a)低效率:長迴圈在最外層

for (col=0; col<5; col++ )

}(b)高效率:長迴圈在最內層

6、for迴圈效率

如果迴圈體內存在邏輯判斷,並且迴圈次數很大,宜將邏輯判斷移到迴圈體的外面。示例(c)的程式比示例(d)多執行了n-1 次邏輯判斷。並且由於前者老要進行邏輯判斷,打斷了迴圈「流水線」作業,使得編譯器不能對迴圈

進行優化處理,降低了效率。如果n 非常大,最好採用示例4-4(d)的寫法,可以提高效率。如果n 非常小,兩者效率差別並不明顯,採用示例4-4(c)的寫法比較好,因為程式更加簡潔。

for (i=0; i表(c) 效率低但程式簡潔

if (condition)

{for (i=0; i

表(d) 效率高但程式不簡潔

常見函式實現

參考mfc下的原始檔以及網上的一些 實現。留著做個參考 strcmp比較兩個字串大小 int mystrcmp const char src,const char dst if ret 0 else if ret 0 else return ret strcpy複製字串 char mystrcpy ...

實現常見的string函式

1.實現strcpy 1.實現strcpy char my strcpy char dest,const char src return ret 2.實現strcat 2.實現strcat 字串拼接 char my strcat char dest,const char src while dest...

函式 常見函式

def fib n if n 1 return 1if n 2 return 1return fib n 1 fib n 2 def hannuo n,a,b,c n 表示有n個盤子 a 代表第乙個塔,開始的塔 b 代表第二個塔,過渡塔 c 代表第三個塔,目標塔 d.在 中n 2,這個分支可以不要,...