strstr()在同一行中搜索两个不同的字符串

时间:2013-06-03 10:20:57

标签: c string 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打印正确。

任何帮助表示感谢。

编辑:虽然所有答案都是正确的(赞成所有答案),但我接受了dasblinkenlight的回答。这是因为我意识到检查布尔条件如下所示就足以满足我的要求。谢谢你的所有答案。

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

3 个答案:

答案 0 :(得分:4)

你不明白这个功能是做什么的。

它会在sBuffer(“haystack”)中为您提供搜索字符串(“the needle”)的地址。它不会修改 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()将起作用,因为您知道要复制的数据的确切长度。

答案 1 :(得分:1)

strstr()返回指向它找到的子字符串的第一个字符的指针。它不会在搜索到的子字符串后终止字符串,这是预期的正确行为。

关于解决方案:如果你有一个非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);
}

答案 2 :(得分: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返回非空指针的唯一情况是它找到与你一直搜索的完全匹配的情况。如果你需要的只是一个布尔“找不到/未找到”标志,你可以只为s1测试s2NULL。您在最终的if声明中已经使用了这个技巧。

相关问题