所以我的代码,无论如何,返回错误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
。
答案 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')
true
为true || 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()
阻止此外,
答案 1 :(得分:0)
这种比较使代码更难阅读。请使用功能strncasecmp()
(在string.h
或strings.h
中):
if (strncasecmp(line, "get ", strlen("get ")) != 0) {
// ...
}
这将修复该行中的逻辑错误 - 您当前的比较将始终评估true
。我还建议启用更多的编译器警告,因为这是任何编译器都应该捕获的。