我想在一個更大的字符串中搜索它後查找字符串的一部分的長度。從指針減去得到的長度
我不能使用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返回負值(即使它的正值是錯誤的)
我想在一個更大的字符串中搜索它後查找字符串的一部分的長度。從指針減去得到的長度
我不能使用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返回負值(即使它的正值是錯誤的)
最終的答案 「一些隨機文本」
長度:
你尋找len - (temp1 - temp)
。第一部分的長度是temp1 - temp
。將其從整個字符串的長度中去除,以獲得剩餘部分的長度。
再回應:
由於strlen
(這是你在你的例子中使用的,即使它僅適用於正確的文本消息)去,直到它找到一個\0
字符,你可以簡單地使用strlen(temp1)
爲輸入的最後部分的長度。如果您真的擔心兩次撥打strlen
會損害您的表現(真的?),那麼您可以使用len - (temp1 - temp)
。
如果您對輸入的第一部分的長度感興趣,則只需要執行指針減法。
如果你想包含在其中\0
在非終端位置的二進制數組來工作,你不能使用strlen
都在你的代碼。但是,您必須有一種方法來指定整個輸入的長度。要麼你有一個整型變量,要麼你有一個特定的分隔符和一個長度計算函數。
如果你有長整數變量,那麼由於輸入的第一部分的長度是通過指針減法得到的,所以你只需要做len - (temp1 - temp)
。
如果您有長度計算功能,只需使用temp1
作爲參數進行調用即可。
PS:不要忘記檢查,如果strstr
返回NULL(順便說一句,你不能使用strstr
,如果你有二進制數據與\0
緩衝區內)
正如我所說,我在處理二進制數據,所以strlen不會工作 – user1692342
編輯答案也包括這種情況下(這是從你說的問題的方式不明顯) –
strlen()不是免費的。它具有運行時成本。由於strlen()已經在temp()上調用,所以指針運算是非常合適的。從strlen()調用兩次沒有任何好處。 –
如果你的數據是不是空終止,那麼你不能調用strstr(),因爲你不能調用strlen()。如果你這樣做,你可以結束掃描過去的數據結束。如果你發現一個匹配(這是很有可能的;讀過數組的末尾並不能保證程序崩潰),那麼你的指針算術是會給你一個負值,因爲你正在減去一個更大的地址從一個較小的一個。另一方面,如果你的數據實際上是以NULL結尾的,那麼你的問題可能是strstr()沒有找到子串,因此返回NULL。你在檢查NULL嗎?否則,你最終做的是:
len1 = temp + len - (char*)NULL;
'temp1 - temp + len'; strpos更好 –
@JoopEggen你的建議值大於len! – user1692342
當我運行這個例子時,我得到了'len1 == 16',這正是我期望的。你怎麼看'len1'是否定的? –