我以为我知道一些关于C指针的基础知识,但我无法弄清楚这个非常基本的启动到HTTP GET请求解析器有什么问题。
我已逐步完成代码并验证strstr()正在返回正确的字符串。但是,该行' p_server = pSubString'不管用。它试图写入导致SIG错误的p_server点。我已尝试过一系列不同的变体&和*运营商,但没有运气。
此外,我所使用的书(Kay和Steven Robbins的UNIX SYSTEMS Programming 19.8 p.676)表示,解析函数应该采用指针指针(即** p_path)。有什么想法吗? (在尝试了p2p后,我去了常规指针,因为我认为这会更容易)。
int parse(char *inlin, char *p_command, char *p_server, char *p_path, char *p_protocol, char *p_port)
{
int length;
char * pSubString;
p_command = inlin;
pSubString = my_strstr( inlin, "www");
p_server = pSubString;
pSubString = my_strstr( p_server, "/");
p_path = pSubString;
pSubString = my_strstr( p_path, "HTTP");
p_protocol = pSubString;
}
谢谢!
PS:my_strstr()
是图书馆strstr()
。我只是在我的代码中添加了一个副本,因此我可以使用GDB逐步完成它。
答案 0 :(得分:0)
是的,你确实需要"指针指针" ...这段代码例如:
pSubString = my_strstr( inlin, "www");
p_server = pSubString;
设置" p_server"到地址" www"被找到。哪个不会改变" call"中使用的指针。 to" parse()" ...一旦parse()
返回就会丢失。
假设您按如下方式修改parse()
:
int parse(char *inlin, char **p_command, char **p_server, char **p_path, char **p_protocol, char **p_port)
{
int length;
char * pSubString;
p_command = inlin;
pSubString = my_strstr( inlin, "www");
*p_server = pSubString;
pSubString = my_strstr( p_server, "/");
*p_path = pSubString;
pSubString = my_strstr( p_path, "HTTP");
*p_protocol = pSubString;
}
假设您从以下代码段中致电parse()
:
char *my_command = NULL;
char *my_server = NULL;
char *my_path = NULL;
char *my_protocol = NULL;
char *my_port = NULL;
parse(buffer, &my_command, &my_server, &my_path, &my_protocol, &my_port);
在此更改之后," my _"的值变量,将包含parse()中对my_strstr()的各种调用的地址。