2016-09-08 4 views
0

私の割り当ての1つでは、HTTP要求の1行を取り出して複数のサブリング(メソッド、HTTPバージョンエラー機能は既に実装されていると考えてください。ここで が関数である:腹筋_経路とクエリ:CS50 PSET6:解析関数はポインタの内容を変更しません

bool parse(const char* line, char* abs_path, char* query) 
{ 
    //I don't wanna deal with a const :p so I copied it into a normal string. 
    char *token; 
    char _line[strlen(line)]; 
    strcpy(_line, line); 

    //Dividing the line into a Method, a request target, and a HTTP_version 
    char *search = " "; 
    token = strtok(_line, search); 
    char method[strlen(token)]; 
    strcpy(method, token); 
    token = strtok(NULL, search); 
    char request_target[strlen(token)]; 
    strcpy(request_target, token); 
    token = strtok(NULL, search); 
    char HTTP[strlen(token)]; 
    strcpy(HTTP, token); 

    //Some error Handling 
    if (strcasecmp(method, "GET")!=0) 
    { 
     error(405); 
     return false; 
    } 
    if(request_target[0]!='/') 
    { 
     error(501); 
     return false; 
    } 
    for (int i=0; i<strlen(request_target); i++) 
    { 
     if(request_target[i]=='"') 
     { 
      error(400); 
      return false; 
     } 
    } 
    if (strcasecmp(HTTP, "HTTP/1.1")!=0) 
    { 
     error(505); 
     return false; 
    } 


    char *search2 = "?"; 
    char* temp1 = strtok(request_target, search2); 
    abs_path = malloc(strlen(temp1)+1); 
    strcpy(abs_path, temp1); 
    char* temp2 = strtok(NULL, search2); 
    query = malloc(strlen(temp2)+1); 
    strcpy(query, temp2); 
    return true; 
    } 

ので、この関数の問題点は、二つのポインタの内容には影響しないということです。それをデバッグした後、私は関数の中で2つが正しい値を得ていることに気付きましたが、それはメイン関数の別の話です。

私を助けてもらえますか? ありがとうございました。現在の関数署名付き

+1

'char_line [strlen(line)];' - > 'char _line [strlen(line)+1];'ヌルターミネータの場合+1。同上。 – BLUEPIXY

+0

ポインタでポインターを渡すか、変更されません。 –

答えて

0

bool parse(const char* line, char* abs_path, char* query) 
abs_path

queryは値によって渡されます。手順でそれらを変更するだけで局所効果を持っているあなたは、ポインタを変更することができるように、メソッドのparamsを変更する必要が

(彼らは自動変数です)(私もパラメータ名を変更):

bool parse(const char* line, char** pabs_path, char** pquery) 

、その後にコード

*pabs_path = malloc(strlen(temp1)+1); 
strcpy(*pabs_path, temp1); 
char* temp2 = strtok(NULL, search2); 
*pquery = malloc(strlen(temp2)+1); 
strcpy(*pquery, temp2); 

プロシージャを呼び出す:

const char* line = "some string"; 
char* abs_path,* query; 
r = parse(line, &abs_path, &query); 

とBLのコメントUEPIXYは有効です。このエラーは、コード全体で繰り返されているより多くの1つの文字を割り当てるか、境界

char _line[strlen(line)+1] 

のうちを取得する:あなたのコードで[strlen(を探して、あなたは、多くの場合のために1を追加することを忘れていることがわかりますヌルターミネータ。

+0

Mercii :)私はそれを評価する –

関連する問題