这是永远不会结束的问题。任务是解析长度不定的Web服务器中的请求行(以C语言表示)。我将以下内容从Web中提取下来作为工作示例。

GET /path/script.cgi?field1=value1&field2=value2 HTTP/1.1

我必须提取绝对路径:/path/script.cgi和查询:?field1=value1&field2=value2。有人告诉我以下功能为关键:strchrstrcpystrncmpstrncpy和/或strstr

到目前为止,这是发生的事情:我了解到,使用strchrstrstr之类的函数绝对可以让我在某些时候截断请求行,但是绝对不能摆脱我不想要的请求行的某些部分,而我如何分层它们也没关系。

例如,下面的一些代码使我接近隔离查询,但是我无法消除http版本。
bool parse(const char* line)
{
    // request line w/o method
    const char ch = '/';
    char* lineptr = strchr(line, ch);

    // request line w/ query and HTTP version
    char ch_1 = '?';
    char* lineptr_1 = strchr(lineptr, ch_1);

    // request line w/o query
    char ch_2 = ' ';
    char* lineptr_2 = strchr(lineptr_1, ch_2);

    printf("%s\n", lineptr_2);

    if (lineptr_2 != NULL)
        return true;
    else
        return false;
}

不用说,我有一个类似的问题试图隔离绝对路径(我可以放弃该方法,但不能放弃?或之后的任何东西),而且我看不到有任何场合可以使用需要我知道先验知识的函数我想从一个位置(通常是数组)复制到另一个位置的字符数是因为,当实时运行该字符时,我不知道请求行会是什么样子。如果有人看到我想念的东西并可以指出正确的方向,我将不胜感激!

最佳答案

一个更优雅的解决方案。

#include <stdio.h>
#include <string.h>

int parse(const char* line)
{
    /* Find out where everything is */
    const char *start_of_path = strchr(line, ' ') + 1;
    const char *start_of_query = strchr(start_of_path, '?');
    const char *end_of_query = strchr(start_of_query, ' ');

    /* Get the right amount of memory */
    char path[start_of_query - start_of_path];
    char query[end_of_query - start_of_query];

    /* Copy the strings into our memory */
    strncpy(path, start_of_path,  start_of_query - start_of_path);
    strncpy(query, start_of_query, end_of_query - start_of_query);

    /* Null terminators (because strncpy does not provide them) */
    path[sizeof(path)] = 0;
    query[sizeof(query)] = 0;

    /*Print */
    printf("%s\n", query, sizeof(query));
    printf("%s\n", path, sizeof(path));
}

int main(void)
{
    parse("GET /path/script.cgi?field1=value1&field2=value2 HTTP/1.1");
    return 0;
}

09-28 06:11