我是C的新手,我正在尝试检查一些字符串。
以下是我的代码,评论说明了我不明白为什么会发生的问题:
if (strstr(recBuff, "GET / HTTP/1.0\r\n\r\n") != NULL)
//Send HTTP/1.0 200
//This gets recognised fine
else if (strstr(recBuff, "GET / HTTP/1.0\r\r") != NULL)
//Send HTTP/1.0 200
//This gets recognised fine
else if (strstr(recBuff, "GET / HTTP/1.0\r\n") != NULL)
//Do something else
//This never gets picked up, and instead goes to the final else...
else
//HTTP/1.0 404
//Etc
我想我的问题是为什么strstr接收\r\n\r\n
并采取行动,但只有\r\n
本身一直持续到最后的其他地方? \r\n\r\n
的其他内容有效,但单个\r\n
的其他内容不适用于单个\r\n
。
TL; DR "GET / HTTP/1.0\r\n\r\n"
被选中,但"GET / HTTP/1.0\r\n"
没有。
答案 0 :(得分:1)
您尚未将代码缩减为SSCCE(Short, Self-Contained, Correct Example),因此我们无法判断您的错误。但是,您认为有两个回车的数据很可能实际上不包含两个相邻的回车。但是,只有某种十六进制转储或类似的东西肯定会显示出来。
这是一个SSCCE,它表明如果给出正确的数据,您的代码可以正常工作:
#include <stdio.h>
#include <string.h>
int main(void)
{
char *examples[] =
{
"YYYYGET / HTTP/1.0\r\nExample 1 Single CRLF",
"YYYYGET / HTTP/1.0\r\n\r\nExample 2 Double CRLF",
"YYYYGET / HTTP/1.0\r\r\nExample 3 Double CR",
"YYYYGET / HTTP/1.0\n\nExample 4 Double NL",
};
for (int i = 0; i < 4; i++)
{
char *recBuff = examples[i];
printf("Data:\n%s\n", recBuff);
if (strstr(recBuff, "GET / HTTP/1.0\r\n\r\n") != NULL)
printf("Option 1 - double CRLF\n");
else if (strstr(recBuff, "GET / HTTP/1.0\r\r") != NULL)
printf("Option 2 - double CR\n");
else if (strstr(recBuff, "GET / HTTP/1.0\r\n") != NULL)
printf("Option 3 - single CRLF\n");
else
printf("Option 4 - no match\n");
}
return 0;
}
$ ./counter-example
Data:
YYYYGET / HTTP/1.0
Example 1 Single CRLF
Option 3 - single CRLF
Data:
YYYYGET / HTTP/1.0
Example 2 Double CRLF
Option 1 - double CRLF
Data:
YYYYGET / HTTP/1.0
Example 3 Double CR
Option 2 - double CR
Data:
YYYYGET / HTTP/1.0
Example 4 Double NL
Option 4 - no match
$
因此,如果您没有看到与您的代码类似的内容,那么您无法获得您认为的数据。
复制不需要YYYY
部分; Example n
信息也不是。YYYY
。尾随部分确保相当难以辨别的字符串是可识别的; {{1}}可以说是绒毛,因为HTTP协议不会以这种垃圾开始。