我正在尝试使用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
答案 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
测试s2
和NULL
。您在最终的if
声明中已经使用了这个技巧。