C字符串检查

时间:2013-09-17 03:27:46

标签: c string strstr

我是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"没有。

1 个答案:

答案 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协议不会以这种垃圾开始。