0

我正在尝试使用 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
4

3 回答 3

4

您不了解该功能的作用。

它为您提供了在sBuffer("the 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")将简单地 return sBuffer,当然仍然包含其余字符,它是相同的内存缓冲区。

如果您需要提取找到的子字符串,则必须自己进行。一个合适的功能是strlcpy()如果你有它,否则strncpy()会起作用,因为你知道要复制的数据的确切长度。

于 2013-06-03T10:23:01.340 回答
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);
}
于 2013-06-03T10:23:31.000 回答
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返回非空指针的唯一情况是它找到与您一直在搜索的内容完全匹配的情况。如果您只需要一个布尔“找到/未找到”标志,您可以简单地测试s1s2for NULL。你已经在你的最后if陈述中使用了这个技巧。

于 2013-06-03T10:23:43.440 回答