2017-12-09 4 views
0

文字列の一部を他の文字列にコピーしようとしています。 私はサブ文字列を開始して終了する2つの識別子を知っています。または192 エンディングになります「\ rをのnC \」または第二:文字列の先頭が「ホスト」になります文字列の一部をコピーする

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

:私は、この文字列からIPをコピーしようとしている

「\ rをする\ n」 の発生は、所望の出力は次のようになります。

192.168.1.200 

私はstrcpyのとのmemcpyを使用してみましたが、IPは、変数である必要がありますので、私はそれがされますどのくらい知っていないか、何それがします最小値は11、最大15文字です。

私はさらにあなたを助けてくれることを願っています。

+1

ようこそ、あなたの質問を編集して、これまでにあなたのコードを追加します... – Grantly

+0

正規表現を使用し、次の2つの問題があるでしょうしてください。 – iBug

答えて

1

あなたは16各オクテットのバイト(最大3バイト、合計12、プラス3点のバッファが必要になり、15であります、プラスゼロターミネーター)。その後

、あなたが言うように、あなたは正確にあなたの読み取りを配置する必要があります。

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これは完璧に動作します – Dylan

0

一つの解決策は、「\ 0」で文字列を終了することを忘れないでくださいHost:

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

スタート抽出からnumberまたは.ているすべての文字を抽出することです。

プログラムの簡略化されたバージョン:

#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

明確にするために、 '' \ 0 ''別名NULバイトがターミネータです。 '' 0 ''という文字を追加しないでください。 – ShadowRanger

+0

問題は、これが文字列の一部でしかないことです。より多くの数字と文字が含まれています。 – Dylan

1

入力文字列の形式が知られている場合、および掲示例入力によって提案されたとして、sscanf()を一緒に使用することができますIPアドレスを抽出するscansetディレクティブ。

%*[^:]を使用すると、コロンに遭遇するまで、入力内の任意の文字と一致するようになります(sscanf())。 *は、割り当てを抑制します。 :文字でスキャンが再開されるので、:という文字列をこの文字と一致するようフォーマット文字列に配置する必要があります。次に、%sディレクティブを使用して、IPアドレスを文字列として照合して格納することができます。次に例を示します。

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

プログラムの出力:

192.168.1.200 
関連する問題