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_path
和 query
是按值传递的。在过程中更改它们仅具有局部效果(它们是自动变量)
您必须更改方法参数以便更改指针(我也更改了参数名称):
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。
在我的一项作业中,我被要求实现一个函数,该函数的主要作用是获取一行 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_path
和 query
是按值传递的。在过程中更改它们仅具有局部效果(它们是自动变量)
您必须更改方法参数以便更改指针(我也更改了参数名称):
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。