たとえば、このアドレスを区切りたいと思います。この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 .... は私が間違って何をしたのですか?
この質問にお答えください。
ありがとうございました。あなたは間違っていた何
あなたは[strtok](http://en.cppreference.com/w/c/string/byte/strtok)を検討しましたか?もちろん – wasthishelpful
。しかし、このsscanfはこの解析にstrtokよりも優れています。これについてもっと良いアイデアはありますか? – kara
['void main()'](http://stackoverflow.com/questions/204476/what-should-main-return-in-c-and-c) – StoryTeller