2016-08-03 21 views
0

たとえば、このアドレスを区切りたいと思います。このipv6アドレスの使用をcのsscanfにどのように分けることができますか?

http://[1fff:0:a88:85a3::ac1f]:8001/index.html 

like.. 

    protocol = http 
    address = 1fff:0:a88:85a3::ac1f 
    port = 8001 
    path = index.html 

私はこのsscanfコードを使用しました。

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 
#include <arpa/inet.h> 

void main() 
{ 
// char url[128] = "http://10.1.35.1:8088/inedex.htm"; 
    char url[128] = "http://[1fff:0:a88:85a3::ac1f]:8001/index.html"; 
    char url_6[128], port[10], path[40]; 

    char *tok, *cp, *host, *proto, /**port, *path,*/ *tok6; 
    char *hostbuf, *portbuf, *buf; 
    int c, len, ulen, cnt_6 = 0; 
    struct in6_addr result; 

    ulen = strlen(url); 
    len = ulen *2 + 10 + 3; 

    if(strncmp(url, "http://[", 8) == 0) 
    { 
     tok = &url[8]; 
     tok[-4] = '\0'; 
     proto = url; 
     sscanf(tok, "%2000[^]]:%s", url_6, path); 

     if(inet_pton(AF_INET6, url_6, &result)) 
     { 
      printf("successful ipv6 address\n"); 
     } 
     else 
     { 
      printf("Invalid ipv6 address\n"); 
     } 
     printf("path= %s\n", path); 
     printf("tok = %s\n", tok); 
    } 
} 

しかし、私はこの行を理解していません。

sscanf(tok, "%2000[^]]:%s", url_6, path); //this line is okay. 

実際には、私はこの行を書いています。

//port and path is pointer.... *port, *path... 
sscanf(tok, "%2000[^]]:%10[^/]%s", url_6, port, path); 

が、私はこの行をデバッグするときに、セグメンテーションフォールトがaccurs .... は私が間違って何をしたのですか?
この質問にお答えください。

ありがとうございました。あなたは間違っていた何

+0

あなたは[strtok](http://en.cppreference.com/w/c/string/byte/strtok)を検討しましたか?もちろん – wasthishelpful

+0

。しかし、このsscanfはこの解析にstrtokよりも優れています。これについてもっと良いアイデアはありますか? – kara

+0

['void main()'](http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c) – StoryTeller

答えて

2

は2つあり:

  1. あなたのバッファよりも大きいsscnafへの最大幅を指定します。
  2. 区切り文字に達すると、sscanfに区切り記号を使用するように指定することはありません(]および/)。

だから多少固定バージョン(あなたの混乱とを除去し、mainは、標準準拠を作った):

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

int main(void) 
{ 
    char url[128] = "http://[1fff:0:a88:85a3::ac1f]:8001/index.html"; 
    char url_6[128], port[10], path[40]; 

    char *tok; 

    if(strncmp(url, "http://[", 8) == 0) 
    { 
     tok = &url[8]; 
     tok[-4] = '\0'; 
     //sscanf(tok, "%2000[^]]:%s", url_6, path); 
     sscanf(tok, "%127[^]]]:%9[^/]/%39s", url_6, port, path); 
     //     ^^  ^- delim '/' consumed here 
     //     |+- delim ':' consumed here 
     //     +- delim ']' consumed here 

     printf("path= %s\n", path); 
     printf("port= %s\n", port); 
     printf("url_6 = %s\n", url_6); 
    } 

    return 0; 
} 

ライブhereそれを参照してください。

+0

@karaを編集しないでくださいあなたが尋ねた質問に無関係に要素を追加する投稿。これはあなたのプログラムを紹介する場所ではなく、セグメンテーション違反を取り除く方法に答えます。 – StoryTeller

+0

OMG!申し訳ありませんが、私はそれを知りませんでした。 – kara

+0

@kara、心配はいりません。あなたはSOにはかなり新しいようです。だからすぐに読む[ここ](http://stackoverflow.com/help) – StoryTeller

関連する問題