无法在C中正确使用strstr()

时间:2019-02-26 20:56:03

标签: c string glibc

因此,我正在用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”。

2 个答案:

答案 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) {
    ...
}

通过这种方式,阅读起来更加容易,并且有助于避免此类错误。