2011-12-12 25 views
0

我現在面臨着strlen的某些問題(有很多情況下,我讀取文件和字符串不是零終止)。所以我正在考慮製作一個裝配例程來計算我的琴絃長度。我會做的只是從字符串的末尾往後走,直到遇到我的第一個字符,然後計算字符串的長度。事實上,當我編寫彙編程序時,我已經有了一個我以前寫過的。彙編中的字符串長度例程作爲C++中strlen的替代者

現在,我想知道,我有什麼理由不應該這樣做?我會失去什麼特別的優勢?

另一種替代方法是將我的字符數組的每個成員都設爲null。我可以一次完成4個字節的彙編,甚至通過一個簡單的for循環。

請記住,我正在談論相當大的數組[64k]。由於我需要在用戶選擇文件時立即顯示文件,因此處理的速度非常快。

編輯: 爲了澄清,說,我知道,我知道字符串的長度,我的意思是:

char* buffer = new char[length]; 

我知道length。但是當我填充這個緩衝區時,我不知道具有ascii字符的確切長度。當我使用strlen時,它不會給我當前的長度。基本上length可以是500,但其中只能有5個有效字符,其餘的495可能是垃圾值。

+6

「我會從字符串末尾往後走,直到遇到我的第一個字符。」如果你知道字符串開始和結束的位置,爲什麼不使用減法來計算字符串長度? –

+1

標籤爲'C++',我會問你爲什麼不使用'std :: string'。另外,你的描述似乎表明你知道字符串的「結束」,但不是開始(「直到遇到我的第一個字符時才倒退),這使得很難確切地遵循你如何進入這種情況有用。你怎麼知道結局?你怎麼知道你什麼時候到達「我的第一個角色」?如果你知道開始和結束,那麼長度就是'len = end - start'。 – Chad

+3

「有很多情況下,我讀取文件和字符串不是零終止」您是否考慮使用某些內容來讀取實際上執行NULL的文件 - 終止字符串?或者甚至更好,如果你知道字符串在哪裏開始和結束的地方......你已經*知道它的長度。 –

回答

4

現在,我想知道,我有什麼理由不應該這樣做?

是的。如果你已經有了字符串和它的開始的結束字節,那麼你知道它的長度:

const char *begin = //beginning. 
const char *end = //last byte of string. 
ptrdiff_t stringLength = (end - begin) + 1; 

+1是因爲end指向字符串的最後一個字節。如果end已經過去了,你就不需要+1了。不需要任何例程來計算你已經知道的東西。

請注意,這裏假定字符串是ASCII或其他單字節每字符編碼。如果您使用某種類型的Unicode編碼(UTF-8,UTF-16等),那麼您必須掃描字符串以確定它有多少個代碼點。

當然,如果它是一種Unicode編碼,那麼需要解決「長度」確切意味着什麼的問題。 「長度」可以是「碼點數量」,「不同字形的數量」,或者甚至「編碼中的碼單元數量」。

+0

感謝您的回答。但不幸的是,這不是我正在尋找的,我爲錯誤地構思問題而抱歉。我編輯了我的問題,使其更清晰一些。 – devjeetroy

+0

我採用第二種方法,現在strlen工作得很好。儘管謝謝你的回答。 – devjeetroy

相關問題