2016-12-16 34 views
0

我正在尝试迭代HTTP请求行以确定其合法性。最终,我的服务器不会知道请求行的样子或多长时间。假设合法请求与下面的请求完全相同。请注意,它只有两个空格,一个?,没有内部“我需要遍历请求行以至少检查空格,但由于我不会提前知道它的长度,也不想声明一个任意大小的数组,这将有点像阅读盲文,下面是我试图发现它是否包含两个空格或其他东西,它返回了一个错误,表示我正在比较整数和指针,我被告知即,除了迭代中,以下功能可能会有所帮助:,和strchr,strcpy的,STRNCMP,strncpy()函数,的strstr任何方向将不胜感激迭代请求线在C

int main() 
{ 
    const char* line = "GET /path/script.cgi?field1=value1&field2=value2 HTTP/1.0"; 

    parse(line); 

} 

bool parse(const char* line) 
{ 
    int spaces = 0; 
    int n = strlen(line); 
    for (int i = 0; i < n; i++) 
    { 
     if (line[i] == " ") 
      spaces++; 
    } 
    if (spaces == 2) 
    { 
     printf("Only 2 spaces!\n"); 
     return true; 
    } 
    else 
    { 
     printf("Illegal request! More than two spaces! Hacker! Hacker! Help!\n"); 
     return false; 
    } 

} 
+1

在'if(line [i] == “”)''你正在比较一个字符'line [i]'和一个字符串'“”''。这是投诉的原因。您可以使用if(line [i] ==“”[0])'(不合理)或if(line [i] =='')'(合理)“之一来解决问题。理解单引号中的字符常量与双引号中的字符串常量之间的区别非常重要。另外,在你调用它之前你应该声明'parse()';如果不这样做,编译器会假定返回类型是“int”(如果它接受它)。 –

+1

请注意(使用固定比较),您将接受'“GET/path/wotnot HTTP/1.0”'作为有效,因为它有两个空格,即使它无效。我相信你需要一个更敏感的测试。 –

+0

@JonathanLeffler谢谢你,约翰森!我真的很惊讶,它导致了一个问题。我没有使用太多的语言,我从来没有意识到C知道“”和“'之间的区别。我会查找底层的概念。再次感谢! – Ryan

回答

1

您需要使用单引号,不是双引号空格字符!