在我的一个任务中,我被要求实现一个函数,该函数在一个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。在调试之后,我意识到在函数内部,它们中的两个得到了正确的值,但它是主函数中的另一个故事。
你能帮帮我吗? 非常感谢。答案 0 :(得分:0)
使用当前的功能签名:
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或者你得到一个越界
char _line[strlen(line)+1]
在整个代码中重复此错误:在代码中查找[strlen(
,您会发现您经常忘记为null终止符添加1。