2016-07-21 5 views
0

したがって、私のコードは、何らかの問題であっても、エラー405(要求行に2つのスペースのみが渡された場合)を返します。これは、私が "GET"が実際に最初の単語であることを判断するコードを作成する際に間違いを犯したと信じさせます。これは、メソッドの型が "GET"であるか、またはその大文字小文字が使用されているかをチェックするすべてのコードです。CS50 Pset6エラー405はprint.cを継続して印刷します

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 i0に初期化しました。

+2

'string.h'関数について聞いたことがありますか? –

+0

line [i]がgに等しい場合、Gと等しくないため、falseを返します。 –

+1

'if!strncasecmp(行、" get "、3)...'は入力するのがずっと簡単で、明らかに理解するために... – twalberg

答えて

1

これはいつもfalseを返しますか?

理由:さんはline、今

  • GETように考えてみましょう

    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] != ' ') 
    
    • としてif文を考えます0 line[i] != 'g'trueであるので、であっても、常にtrueと評価される。したがって、(line[i] != 'g' || line[i] != 'G')||は遅延演算子であるようtruetrue || false == trueとして

    • についてさらに式が評価されていないであり、それはこのようtrue || anything == true

    • ように、第1 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'true && false == falseとしてfalseに評価されますし、さらに表現が検出されたtrueまでチェックされます。

    • trueに遭遇されていない場合は、if()ブロックは@twalbergとして

    さらに、

    • が入力されていないがcommentに示唆している、それは非常に読みやすいだろうとif声明をif(!strncasecmp(line, "get ", 3))として使用するとわかります比較が読みコードがはるかに困難になりことclick

  • 0

    strings.hヘッダファイル

  • はここstrncasemp()機能についての詳細を知っています。代わりに、(string.hまたはstrings.hのいずれかで)機能strncasecmp()を使用します。

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

    これは、その行に論理エラーを修正する - あなたの現在の比較は常にtrueを評価します。私はまた、よりコンパイラの警告を有効にすることをお勧めします。これは、コンパイラが捕まえるべきものであるためです。

  • 関連する問題