2016-08-07 9 views
-2

この文字列を解析するにはGET /STA/ID=HelloWorld/Pass=Testin123 HTTP/1.1まず、STAをチェックする必要があります。 PassHTTP文字列を解析する

それが最初の文字列におけるSTAの存在を確認すべきであるCHARデータ型に格納なければならない。この場合Testin123に、CHARデータ型SSIDPassの値に店舗でなければならない。この場合HelloWorldIDの値を置きます。存在しない場合は、ループに入りません。終了する場合は、IDPassを検索してください。それを保管してください。

ここで問題は、IDpassの値を保存できません。 STAも検索できません。

char GetString[] = "GET /STA/ID=Test/Pass=123 HTTP/1.1"; 

char *get = strtok(GetString, " "); 
char *request = strtok(NULL, " "); 
char *rtype = strtok(NULL, " "); 
char *FirstPart; 

int main() 
{ 
if (request != NULL) 
{ 
    FirstPart = strtok(request,"/"); 
    while(FirstPart) 
    { 
    if (!strncmp(part, "STA")) 
     { 
     //Print STA Found 

      if(!strncmp(part, "ID=", 3)) 
      { 
       //Store value of ID 
      } 

      if(!strncmp(part, "Pass=", 5)) 
      { 
      //Store the Pass 
      } 
      } 
     } 
     FirstPart =strtok(NULL,'/'); 
    } 
} 
+0

これは異常終了する場所ですが、トークン化は正しく行われましたが、strcmpとの文字列の等価性はテストされませんでしたか? – covener

+0

@covener私は完全なコードを追加しました。 –

+2

問題は、マイナーエラーがメジャーエラーを隠していることです。 strncmpへの無効な呼び出しがあり、長さの引数はありません。文字2番目の引数を持つstrtokへの無効な呼び出しがあります。これは文字列でなければなりません。あなたのwhileループはトークンを踏んでいますが、そのトークンが "STA"であれば何も行いませんが、それが他のものかどうかを確認しますが、 "STA"であることを知っているので、 。 – MAP

答えて

1

クリーンアップが少し必要です。 1つのヒント:コンパイラですべての警告とエラーを切り替えます。あなたのコードはコンパイルされていないし、最小限の条件だ。それにもかかわらず

しかし:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() 
{ 
    char GetString[] = "GET /STA/ID=Test/Pass=123 HTTP/1.1"; 
    // you cannot do it globally in that way, so I pulled it all into main() 
    char *request, *FirstPart; 
    // please don't use all upper-case for normal variables 
    // I did it for some clarity here 
    char *ID, *PASS; 

    // skip "GET" 
    strtok(GetString, " "); 
    // get first part 
    request = strtok(NULL, " "); 

    if (request != NULL) { 
    FirstPart = strtok(request, "/"); 
    // check for base condition 
    if (!strncmp(FirstPart, "STA", 3)) { 
     //Print STA Found 
     printf("STA = %s\n", FirstPart); 
    } else { 
     fprintf(stderr, "STA not found!\n"); 
     exit(EXIT_FAILURE); 
    } 
    FirstPart = strtok(NULL, "/"); 
    // graze the key-value combinations 
    while (FirstPart) { 
     // We check them all here, one after the other 
     if (!strncmp(FirstPart, "ID=", 3)) { 
    //Store value of ID 
    ID = strchr(FirstPart, '='); 
    // ID is now "=Test", so skip '=' 
    ID++; 
    printf("ID = %s, value of ID = %s\n", FirstPart, ID); 
     } else if (!strncmp(FirstPart, "Pass=", 5)) { 
    //Store the Pass 
    PASS = strchr(FirstPart, '='); 
    // PASS is now "=123", so skip '=' 
    PASS++; 
    printf("PASS = %s, value of PASS = %s\n", FirstPart, PASS); 
     } else { 
    printf("Unknown part \"%s\", ignoring\n", FirstPart); 
     } 
     FirstPart = strtok(NULL, "/"); 
    } 
    } else { 
    fprintf(stderr, "No input at all\n"); 
    exit(EXIT_FAILURE); 
    } 
    exit(EXIT_SUCCESS); 
} 

はnull終端値へのポインタIDPASSポイントは唯一、彼らは独立したメモリではありません。 malloc()を使用して数値を取得し、その数値をstrlen()で測定することができます。 IDを例として示します。ptr_to_mem_for_ID = malloc(strlen(ID));