2013-06-03 57 views
0

我試圖尋找使用一個的strstr行兩種不同的字符串。的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然而被正確打印。

任何幫助表示讚賞。

編輯:儘管所有的答案都正確(upvoted所有答案),我接受dasblinkenlight的答案。這是因爲我意識到檢查布爾條件如下所示就足以滿足我的要求。感謝所有的答案。

if ((strstr (sBuffer, "This")) && (strstr (sBuffer, "test"))) 
     //do something 

回答

1

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會返回一個非空指針的唯一情況是當它找到確切匹配你一直在尋找的東西。如果您只需要一個布爾型「找到/未找到」標誌,則可以簡單地測試s1s2以獲得NULL。您在最終的if聲明中已經使用了此技巧。

4

你不理解函數的功能。

它給你在sBuffer(「乾草堆」)的地址,其中搜索字符串(「針」)已被找到。它不會修改 haystack字符串,所以它不會終止子字符串。

您有:

  +---+---+---+---+---+---+---+--+---+---+---+---+---+---+---+---+----+ 
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()工作,因爲你知道數據的準確長度進行復制。

+0

關於如何獲得我期待的預期輸出的任何線索? – user32262

+1

@ user32262'memcpy(some_buffer,retval_of_strstr,strlen(needle))'然後NUL終止'some_buffer'。 – 2013-06-03 10:28:40

+0

那麼在這種情況下哪一個更好? strncpy()或memcpy()? – user32262

1

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); 
} 
相關問題