2016-12-16 62 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

您需要使用單引號,不是雙引號空格字符!