2016-08-07 53 views
-2

Wie kann ich diese Zeichenfolge analysieren GET /STA/ID=HelloWorld/Pass=Testin123 HTTP/1.1 Zuerst muss ich nach STA überprüfen, wenn es vorhanden ist, weiterhin die Zeichenfolge scannen. Legen Sie Wert von ID in diesem Fall HelloWorld sollte Testin123 Speicher in char-Datentyp SSID und Wert von Pass, in diesem Fall sein sollte, Speicher in Datentyp char PassHTTP-String analysieren

Es soll zuerst das Vorhandensein von STA in String bestätigen. Wenn es nicht vorhanden ist, treten Sie nicht in Schleife ein. Wenn es beendet wird, suchen Sie nach ID und Pass. Speichern Sie es.

Jetzt ist das Problem, ich bin nicht in der Lage, Wert ID und pass zu speichern. Es kann auch nicht nach STA gesucht werden.

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

Das ist ein seltsamer Ort zu stoppen, haben Sie die Tokenizing richtig, aber nicht für String Gleichheit mit Strcmp getestet? – covener

+0

@covener Ich habe den vollständigen Code hinzugefügt. –

+2

Das Problem ist, dass die kleinen Fehler Ihren Hauptfehler verbergen. Es gibt einen ungültigen Aufruf von strncmp ohne Längenangabe. Es gibt einen ungültigen Aufruf von strtok mit einem zweiten Zeichen des Zeichens, das eine Zeichenkette sein sollte. Ihre while-Schleife durchläuft die Token, tut aber nur etwas, wenn dieses Token "STA" ist, aber wenn es das ist, prüft es, ob es etwas anderes ist, aber Sie wissen, dass es "STA" ist, so dass die anderen if-Klauseln niemals übereinstimmen können . – MAP

Antwort

1

Benötigt ein bisschen Aufräumarbeiten. Ein Tipp: Schalten Sie alle Warnungen und Fehler mit Ihrem Compiler ein, sie existieren aus einem bestimmten Grund. Dein Code wurde nicht einmal kompiliert und das ist die minimale Bedingung hier.

Aber trotzdem:

#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); 
} 

Die Zeiger ID und PASS Punkt zu den nullterminierten Werte nur, sie sind nicht unabhängig Speicher. Sie könnten malloc() verwenden, um etwas zu erhalten, und die Menge mit strlen() messen. Mit ID als Beispiel: ptr_to_mem_for_ID = malloc(strlen(ID));