[英]strstr() to search two different strings in the same line
我正在嘗試使用strstr在一行中搜索兩個不同的字符串。
sBuffer = "This is app test"
s1= strstr (sBuffer, "This");
s2= strstr (sBuffer, "test");
printf("%s\n", s1); //prints - This is app test
printf("%s\n", s2); //prints - test
if (s1 && s2)
//do something
s1的預期輸出應為字符串"This"
但它將打印s1的整個字符串。
s2但是正確打印。
任何幫助表示贊賞。
編輯:盡管所有答案都是正確的(所有答案均已贊成),但我接受dasblinkenlight的答案。 這是因為我意識到檢查如下所示的布爾條件就可以滿足我的要求。 感謝所有的答案。
if ( (strstr (sBuffer, "This")) && (strstr (sBuffer, "test")) )
//do something
您不了解該功能的作用。
它為您提供了在sBuffer
(“大海撈針”)中找到搜索字符串(“ needle”)的地址。 它不會修改干草堆字符串,因此不會終止子字符串。
你有:
+---+---+---+---+---+---+---+--+---+---+---+---+---+---+---+---+----+
sBuffer: | T | h | i | s | | i | s | | a | p | p | | t | e | s | t | \0 |
+---+---+---+---+---+---+---+--+---+---+---+---+---+---+---+---+----+
^ ^
| |
| |
strstr(sBuffer, "Test") strstr(sBuffer, "test")
如您所見, strstr(sBuffer, "Test")
將僅返回sBuffer
,當然它仍然包含其余字符,它是相同的內存緩沖區。
如果需要提取找到的子字符串,則必須自己提取。 如果您擁有合適的函數,請使用strlcpy()
,否則strncpy()
將起作用,因為您知道要復制的數據的確切長度。
strstr()
返回指向找到的子字符串的第一個字符的指針。 它不會NUL終止搜索的子字符串之后的字符串,這是預期的正確行為。
關於解決方案:如果您有一個非const
字符串,則可以簡單地對其進行修改,以使其在正確的位置處被NUL終止(但是請注意所做的修改)。 如果不是,則復制該子字符串。
const char *haystack = "abcd efgh ijkl";
const char *needle = "efgh";
const char *p = strstr(haystack, needle);
if (p) {
size_t l = strlen(needle);
char buf[l + 1];
memcpy(buf, p, l);
buf[l] = 0;
printf("%s\n", buf);
}
strstr
的返回值是指向匹配點處未經修改的原始字符串的指針。 第二個調用顯示test
的原因是一個巧合: test
只是碰巧在搜索到的字符串的末尾。 如果sBuffer
是"This is app test of strstr"
,則第二個調用的輸出將是test of strstr
,而不僅僅是test
。
要解決此問題,您可以像這樣更改程序:
printf("%s\n", s1 ? "This" : "");
printf("%s\n", s2 ? "test" : "");
之所以起作用,是因為您知道, strstr
返回非空指針的唯一情況是找到與您要查找的內容完全匹配的字符串。 如果您只需要一個布爾值“ found / not found”標志,則只需測試s1
和s2
的NULL
。 您在最終的if
語句中已經在使用此技巧。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.