CS50 Pset6错误405继续打印server.c

时间:2016-07-21 19:14:09

标签: c cs50

所以我的代码,无论如何,返回错误405(一旦测试,请求行中只有两个空格被传递)。这让我相信我在创建代码时犯了一个错误,以确定“GET”实际上是第一个单词。这是我的所有代码,导致“检查”方法类型为“GET”或其任何大小写。

   int s;
   s=0;
   int i=0;
    for(int q=0; q<strlen(line); q++)
    {
        if(line[q] == ' ')
            s++;
    }
    if(s!=2)
    {
       error(400);
       return false;
    }
if((line[i] != 'g' || line[i] != 'G') || (line[i+1] != 'e' || line[i+1] != 'E') || (line[i+2] != 't' || line[i+2] != 'T')||
    (line[i+3] != ' '  ))
        {
            error(405);
            return false;
        }

任何原因这总是会返回false?我已将int i初始化为0

2 个答案:

答案 0 :(得分:1)

  

任何原因这总是会返回false?

原因:

  • if语句视为:

    if(expression_1 || expression_2 || expression_3 || expression_4)
    //where
    //expression_1 is (line[i] != 'g' || line[i] != 'G')
    //expression_2 is (line[i] != 'e' || line[i] != 'E')
    //expression_3 is (line[i] != 't' || line[i] != 'T')
    //expression_4 is (line[i] != ' ')   
    
  • 让我们将line视为GET

  • 现在,expression_1 始终评估为true即使line[i] == G,因为line[i] != 'g'true。因此,(line[i] != 'g' || line[i] != 'G') truetrue || false == true

  • 现在不会评估更多表达式,因为||是一个惰性运算符,它会在true

  • 上停止对第一次true || anything == true次出现的评估
  • 因此,始终输入if块,并始终返回false

解决方案:

  • 更改代码中的if

    if((line[i] != 'g' || line[i] != 'G') || (line[i+1] != 'e' || line[i+1] != 'E') || (line[i+2] != 't' || line[i+2] != 'T') || (line[i+3] != ' '  ))
    
  • 以下内容:

    if((line[i] != 'g' && line[i] != 'G') || (line[i+1] != 'e' && line[i+1] != 'E') || (line[i+2] != 't' && line[i+2] != 'T') || (line[i+3] != ' '  ))
    
  • 此处line[i] != 'g' && line[i] != 'G'评估为false true && false == false,并检查其他表达式,直到遇到true

  • 如果未遇到true,则未输入if()阻止

此外,

  • 正如@twalberg中提到的 comment 一样,如果您使用if声明,那么它的可读性和可理解性都很高if( !strncasecmp(line, "get ", 3) )包含strings.h标题文件

  • 在此处详细了解strncasemp()功能: click

答案 1 :(得分:0)

这种比较使代码更难阅读。请使用功能strncasecmp()(在string.hstrings.h中):

if (strncasecmp(line, "get ", strlen("get ")) != 0) {
    // ...
}

这将修复该行中的逻辑错误 - 您当前的比较将始终评估true。我还建议启用更多的编译器警告,因为这是任何编译器都应该捕获的。