沒有完美的strcpy

2021-04-13 06:44:51 字數 2743 閱讀 4906

是否效率優先

null

指標處理

重疊(源和目的相同是其一種特殊情況)處理

字串結束字元

字元型別

extern

"c"char * unchecked_strcpy(char *d,const

char *s )

這個版本已經沒有什麼好改動的地方了,在效率方面它可以得滿分。注意

extern 「c」

,不是隨便寫上去的,沒錯,它可以是乙個

c函式。作為一種低層程式庫,完全有理由要求程式設計師自己控制好陣列越界,空指標,野指標的情況,並將這些規格明確寫於說明書上。

extern

"c"char * unchecked_strcpy_backward(char *d, const

char *s )

returnd;}

extern

"c"int

strcpy_safe(char *d,

const

char *s )

unchecked_strcpy_backward(d,s);

return 0;//no error

}

unchecked_strcpy_backward

實現逆向字串拷貝。

strcpy_safe

,處理了幾種常見的情況,所以這樣的效率是不高的。當源和目的相同時直接返回錯誤碼

1,但是我們想想在實際情況中,這種概率又能有多高?串指向空時,直接返回錯誤碼

2。重疊時,逆向拷貝,然而逆向拷貝一定就是正確的結果嗎?不見得。只是我們按照普通思維認為這是正確的。

即使這樣,還有兩個安全問題無法解決,源或目的字串是野指標,目的字串的緩衝區溢位。從理論上說,這兩種情況超越了

c++的控制。

所以,從安全意義講,永遠沒有乙個安全的

strcpy

實現。我們不本著信任程式設計師的態度開發程式,永遠也沒有安全可言,這樣只會給自己帶來無盡煩惱。

template

char_type>

struct

nonnullstringchecker

static

void

handle(char_type* p1 , char_type* p2)

};

template

char_type>

struct

static

void

handle(char_type* d,char_type* s)

};

template

<

typename

char_type = char,

char_type

end_char = '/0',

class

nullstringchecker = nonnullstringchecker

,

class

>

class

strcpy_template

else

return 0;

} };

是的,這是乙個

functor template

,不是乙個

function template

,因為function template

不支援預設引數。

從字元型別,字串結束符號,空指標處理,重疊處理

4個方面引數化這個類模版。當然,不能強迫所有人的模版技術都能達到

alexandrescu

的水平(它把

policy class

和meta template programming

在loki

中運用的出神入化),所以必須提供一組預設的引數給普通使用者使用。

從程式看出

nullstringchecker

和都要提供

check

和handle

介面。為了更安全的目的,你可以在

check

中做出各種條件檢查,並在

handle

中做處理或者丟擲異常。

這個應該是最具有彈性的版本,如果面試者看重

template

技術,那麼這個版本一定能得乙個高分。

沒有完美的解決方案。

公司的考察程式設計風格,思維嚴密程度,語言細節等等都太片面。程式設計風格是個人問題,強迫別人改變是一種不禮貌和粗魯的行為,從深層次看,是一種不尊重人權的做法。而思維嚴密無非就是做錯誤檢查,難道效率和安全是矛盾的,這個道理沒人明白?在沒有要求效率或者安全優先的情況下,任何一種實現方法都是正確的。考察思維的嚴密程度使用這種方法實在是愚蠢至極。如果要考細節,我倒想問問他們一些問題:乙個編譯單元的定義是什麼?成員函式模版全特化版本在沒有被呼叫時,編譯器會為其生成**嗎?

export

關鍵字的用途?

我同意侯捷的

「天下之事,必做於細

」。但是,在程式設計方面未必可以以小見大。

lippman

的《inside c++ object

》和alexandrescu

的《modern c++ design

》錯誤頻繁,仍然不影響是經典。

scott meyers

到現在還沒有準備寫《

effective template

》,仍然不影響他是乙個大師。無聊的人才以細節定成敗。

沒有完美的決定

我沒無法判斷,現在的乙個決定,到底是乙個孰對孰錯的決定,除非,你已經為這個決定邁出了第一步,在實踐中找到了答案,但是這個時候,決定的對錯已經是沒有意義了,它已經是過去式了,你唯一能做的是,做下乙個決定。在做某些重大抉擇時,我經常猶豫,要是這個決定錯了怎麼辦?那對我的損失和影響將是多麼大啊,所以,我遲...

完美的代價

問題描述 回文串,是一種特殊的字串,它從左往右讀和從右往左讀是一樣的。小龍龍認為回文串 才是完美的。現在給你乙個串,它不一定是回文的,請你計算最少的交換次數使得該串變成乙個完美 的回文串。交換的定義是 交換兩個相鄰的字元,例如 mamad 第一次交換 ad mamda 第二次交換 md madma ...

完美的序列

題目描述 lyk 認為乙個完美的序列要滿足這樣的條件 對於任意兩個位置上的數都不相同。然而並不是所有的序列都滿足這樣的條件。於是 lyk 想將序列上的每乙個元素都增加一些數字 當然也可以選擇不增加 使得整個序列變成美妙的序列。具體地,lyk 可以花費 1 點代價將第 i 個位置上的數增加 1,現在 ...