CS50 PSET6:解析函数不改变指针内容

CS50 PSET6: Parse function doesn't change pointers content

在我的一项作业中,我被要求实现一个函数,该函数的主要作用是获取一行 HTTP 请求并从中提取多个子字符串(方法、HTTP 版本等)。请考虑错误函数已经实施。 这是函数:

    bool parse(const char* line, char* abs_path, char* query)
{
    //I don't wanna deal with a const :p so I copied it into a normal string.
    char *token;
    char _line[strlen(line)];
    strcpy(_line, line);

    //Dividing the line into a Method, a request target, and a HTTP_version
    char *search = " ";
    token = strtok(_line, search);
    char method[strlen(token)];
    strcpy(method, token);
    token = strtok(NULL, search);
    char request_target[strlen(token)];
    strcpy(request_target, token);
    token = strtok(NULL, search);
    char HTTP[strlen(token)];
    strcpy(HTTP, token);

    //Some error Handling
    if (strcasecmp(method, "GET")!=0)
    {
       error(405);
       return false;
    }
    if(request_target[0]!='/')
    {
       error(501);
       return false;
    }
    for (int i=0; i<strlen(request_target); i++)
    {
       if(request_target[i]=='"')
       {
          error(400);
          return false;
       }
    }
    if (strcasecmp(HTTP, "HTTP/1.1")!=0)
    {
       error(505);
       return false;
    }


    char *search2 = "?";
    char* temp1 = strtok(request_target, search2);
    abs_path = malloc(strlen(temp1)+1);
    strcpy(abs_path, temp1);
    char* temp2 = strtok(NULL, search2);
    query = malloc(strlen(temp2)+1);
    strcpy(query, temp2);
    return true;
   }

所以这个函数的问题是它不影响两个指针的内容:abs_path和query。调试后我发现在函数内部它们两个都得到了正确的值,但是在main函数中就是另外一回事了。

你能帮帮我吗? 非常感谢。

使用当前函数签名:

bool parse(const char* line, char* abs_path, char* query)

abs_pathquery 是按值传递的。在过程中更改它们仅具有局部效果(它们是自动变量)

您必须更改方法参数以便更改指针(我也更改了参数名称):

bool parse(const char* line, char** pabs_path, char** pquery)

然后在代码中

*pabs_path = malloc(strlen(temp1)+1);
strcpy(*pabs_path, temp1);
char* temp2 = strtok(NULL, search2);
*pquery = malloc(strlen(temp2)+1);
strcpy(*pquery, temp2);

调用过程时:

const char* line = "some string";
char* abs_path,* query;
r = parse(line, &abs_path, &query);

并且 BLUEPIXY 的评论有效:再分配 1 个字符,否则您将越界

 char _line[strlen(line)+1]

此错误在您的代码中重复出现:在您的代码中查找 [strlen(,您会发现您经常忘记为空终止符添加 1。