2013-06-21 64 views
0

我想在一個更大的字符串中搜索它後查找字符串的一部分的長度。從指針減去得到的長度

我不能使用strlen,因爲我正在處理二進制數據。

char *temp= "this is some random text"; 
char *temp1 = strstr(temp,"some"); 
int len = strlen(temp); 
int len1 =0; 

len1 = temp+len - temp1; 

得到的LEN1返回負值(即使它的正值是錯誤的)

+0

'temp1 - temp + len'; strpos更好 –

+0

@JoopEggen你的建議值大於len! – user1692342

+0

當我運行這個例子時,我得到了'len1 == 16',這正是我期望的。你怎麼看'len1'是否定的? –

回答

1

最終的答案 「一些隨機文本」

長度:

你尋找len - (temp1 - temp)。第一部分的長度是temp1 - temp。將其從整個字符串的長度中去除,以獲得剩餘部分的長度。

再回應

由於strlen(這是你在你的例子中使用的,即使它僅適用於正確的文本消息)去,直到它找到一個\0字符,你可以簡單地使用strlen(temp1)爲輸入的最後部分的長度。如果您真的擔心兩次撥打strlen會損害您的表現(真的?),那麼您可以使用len - (temp1 - temp)

如果您對輸入的第一部分的長度感興趣,則只需要執行指針減法。

如果你想包含在其中\0在非終端位置的二進制數組來工作,你不能使用strlen都在你的代碼。但是,您必須有一種方法來指定整個輸入的長度。要麼你有一個整型變量,要麼你有一個特定的分隔符和一個長度計算函數。

如果你有長整數變量,那麼由於輸入的第一部分的長度是通過指針減法得到的,所以你只需要做len - (temp1 - temp)

如果您有長度計算功能,只需使用temp1作爲參數進行調用即可。

PS:不要忘記檢查,如果strstr返回NULL(順便說一句,你不能使用strstr,如果你有二進制數據與\0緩衝區內)

+0

正如我所說,我在處理二進制數據,所以strlen不會工作 – user1692342

+0

編輯答案也包括這種情況下(這是從你說的問題的方式不明顯) –

+0

strlen()不是免費的。它具有運行時成本。由於strlen()已經在temp()上調用,所以指針運算是非常合適的。從strlen()調用兩次沒有任何好處。 –

2

如果你的數據是不是空終止,那麼你不能調用strstr(),因爲你不能調用strlen()。如果你這樣做,你可以結束掃描過去的數據結束。如果你發現一個匹配(這是很有可能的;讀過數組的末尾並不能保證程序崩潰),那麼你的指針算術會給你一個負值,因爲你正在減去一個更大的地址從一個較小的一個。另一方面,如果你的數據實際上是以NULL結尾的,那麼你的問題可能是strstr()沒有找到子串,因此返回NULL。你在檢查NULL嗎?否則,你最終做的是:

len1 = temp + len - (char*)NULL;