因此,我正在用C语言构建一个Web服务器。我想使用正则表达式解析请求,但此刻,我想我会尽快做出一些使其首先工作的事情。目前,我正在实现cookie并查找请求中是否包含我正在使用的cookie字段。
int find_cookie(const char * request){
char * start_pointer = NULL;
long ret = 0;
if ((start_pointer = strstr(request, "Cookie:") != NULL)){
//Do stuff with the pointer
//such as using strtol to get the value as a number
ret = strtol(start_pointer + strlen("Cookie:"), NULL, 10);
}else return 0;
return (int) ret;
}
现在,人们会认为问题出在strtol()上。但是,在使用GDB之后,我注意到当没有cookie字段时,它返回NULL(如预期的那样),但是,另一方面,如果它存在,并且我尝试打印start_pointer的值,它将打印:“无法访问内存地址0x1”。怎么了顺便说一下,当我调试程序时,我可以看到请求变量包含整个请求,并在末尾添加了“ \ 0”。
答案 0 :(得分:3)
您的操作顺序有误。尝试以下方法:
if ((start_pointer = strstr(request, "Cookie:")) != NULL){
否则,您将start_pointer
设置为比较结果,即1
(是)。
答案 1 :(得分:0)
if ((start_pointer = strstr(request, "Cookie:") != NULL)){
应该是
if (((start_pointer = strstr(request, "Cookie:")) != NULL){
请注意更改括号的位置。
分配运算符=
的优先级比!=
运算符低。因此,您所拥有的等同于:
if ((start_pointer = (strstr(request, "Cookie:") != NULL)){
基本上是将比较结果分配给start_pointer
。
但是,您根本不需要与NULL进行比较(因为C中的任何非零值均为“ true”)。您可以简单地写:
if ((start_pointer = strstr(request, "Cookie:"))){
...
}
或
char * start_pointer = strstr(request, "Cookie:");
if (start_pointer) {
...
}
通过这种方式,阅读起来更加容易,并且有助于避免此类错误。