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

时间:2016-09-08 19:14:19

标签: c function pointers cs50

在我的一个任务中,我被要求实现一个函数,该函数在一个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。在调试之后,我意识到在函数内部,它们中的两个得到了正确的值,但它是主函数中的另一个故事。

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

1 个答案:

答案 0 :(得分:0)

使用当前的功能签名:

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或者你得到一个越界

 char _line[strlen(line)+1]

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