2017-12-09 5 views
0

Ich versuche, einen Teil einer Zeichenfolge in einer anderen Zeichenfolge zu kopieren. Ich kenne die 2 Bezeichner, die die Unterzeichenfolge beginnen und beenden.Kopieren Sie einen Unterteil einer Zeichenfolge

Ich versuche, die IP-Adresse aus dieser Zeichenfolge zu kopieren: oder 192 Die Endung „\ r \ nC“ wird oder die zweite:

0x200085f6 <memp_memory+4502> "GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection 

Der Beginn der Zeichenfolge „Host“ sein Auftreten von „\ r \ n“ so ist die gewünschte Ausgabe ist:

192.168.1.200 

ich versuche strcpy und memcpy verwenden, aber die IP hat, variabel sein, damit ich weiß nicht, wie lange es dauern wird oder was es will be, das Minimum ist 11 und das Maximum 15 Zeichen.

Ich hoffe, Sie können mir weiter helfen.

+1

Willkommen bitte Ihre Frage bearbeiten und Ihren Code hinzufügen, so weit ... – Grantly

+0

Verwenden von regulären Ausdrücken und Sie werden zwei Probleme. – iBug

Antwort

1

Sie werden für jedes Oktett, insgesamt 12, plus drei Punkte einen Puffer von 16 Byte (max 3 Bytes benötigen, ist 15 , plus Null-Terminator).

Dann, wie Sie sagen, müssen Sie genau Ihre Lese positionieren:

host = strstr(string, "Host: "); 
if (!host) { 
    // Problem. Cannot continue, the string has not the format expected. 
} 
host += strlen("Host: "); 
end = strstr(host, "\r\n"); 
if (!end) { 
    // Problem 
} 
// Sanity check: end - host must be less than 16. Someone could send you 
// Host: 192.168.25.12.Hello.I.Am.Little.Bobby.Headers\r\n 
if ((end - host) > 15) { 
    // Big problem 
} 
// We now know where the address starts, and where it ends. 
// Copy the string into address 
strncpy(address, host, (end-host)); 
// Add zero terminator to make this a C string 
address[end-host] = 0x0; 
+0

Tnx das funktioniert perfekt – Dylan

0

Eine Lösung ist, alle Zeichen zu extrahieren, die number oder . aus der Gewinnung

"GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection" till `\r` is encounter. 

Anfang sind nach Host: Denken Sie daran, die Zeichenfolge mit ‚\ 0‘ zu beenden.

vereinfachte Version des Programms:

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

int main() { 

    char ip[64]; 
    char *p = NULL; 
    char *str = "GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection"; 
    char c; 
    int i = 0; 
    int len; 

    len = strlen("Host "); 
    p = strstr(str,"Host: "); 

    if(p) 
    {  
     while(1) 
     { 
     c = *(p+i+len); 

     if(c != '\r' && c!= '\0') 
     { 
      if(c == ' '){ 
      i++; 
      continue; 
      } 

      ip[i++] = c; 
     } 
     else 
     { 
      ip[i] = '\0'; 
      break; 
     } 

    } // while 

    } 


    printf("Ip=%s", ip); 
    return 0; 
} 

OUTPUT:

Ip=192.168.1.200 
+0

Um klar zu sein, ist ein '' 0'' aka 'NUL'-Byte der Terminator. Hängen Sie das Zeichen "0" nicht an. – ShadowRanger

+0

Das Problem ist, dass dies nur ein Teil der Zeichenfolge ist. Es enthält mehr Zahlen und Buchstaben. – Dylan

1

Wenn das Format der Eingabezeichenfolge ist bekannt, und sind, wie durch die gesetzte Beispiel Eingabe vorgeschlagen, sscanf() kann mit verwendet werden die Scanset-Direktive, um die IP-Adresse zu extrahieren.

Die Verwendung von %*[^:] bewirkt, dass sscanf() alle Zeichen in der Eingabe abgleicht, bis ein Doppelpunkt angetroffen wird. Die * unterdrückt die Zuweisung. Das Scannen wird mit dem Zeichen : fortgesetzt, sodass ein Literal : in die Formatzeichenfolge eingefügt werden muss, um mit diesem Zeichen übereinzustimmen. Dann kann die Direktive %s verwendet werden, um die IP-Adresse als Zeichenfolge abzugleichen und zu speichern. Hier ein Beispiel:

#include <stdio.h> 

#define BUF_SZ 256 

int main(void) 
{ 
    const char *input = "GET/HTTP/1.1\r\nHost: 192.168.1.200\r\nConnection"; 

    char ip_address[BUF_SZ]; 
    if (sscanf(input, "%*[^:]: %255s", ip_address) == 1) { 
     puts(ip_address); 
    } 

    return 0; 
} 

Programmausgabe:

192.168.1.200 
Verwandte Themen