2011-12-05 22 views
1

を分割I次の文字列があります。"http://www.google.ie/" .Iは"www.google.ie"Cの初心者:文字列

がどのように私はCでこれを行うのですか文字列を作成したいですか?ここで私はこれまで試したものです:

char* url="http://www.google.ie/"; 
char* url_stripped=NULL; 
char* out=strtok(url,"http://"); 
while(out){ 
    out=strtok(0,"."); 
    url_stripped=out; 
    break; 
} 
printf("%s\n",url_stripped); 

をしかし、それは物事がすることworking.Iも、「T」、「T」または「P」、I「はh」を含むURLを持っている場合ことを恐れませんうんざりする

また、最初から「https://」を外すことができる必要があります。

+0

トライはstrstr()が同様に動作するかもしれません:) – niko

+0

2番目のスラッシュで分割したい場合は、なぜあなたは '.'にトークン化するのですか? –

+1

http://stackoverflow.com/questions/726122/best-ways-of-parsing-a-url-using-c(bortzmeyerによるEsp。答え) –

答えて

1

文字列が"http://"または"https://"で始まっているかどうかを確認してから、7または8文字をスキップしてから、最初に'/'を検索しますか?

char *url="http://www.google.ie/"; 
char *tmp = url; 
char *stripped_url; 

if (strncmp(tmp, "http://", 7) == 0 || strncmp(tmp, "https://", 8) == 0) 
    tmp += (tmp[4] == 's') ? 8 : 7; /* Skip over the "http://" or "https://" */ 

char *slash = strchr(tmp, '/'); 
if (slash != NULL) 
    stripped_url = strndup(tmp, slash - tmp); /* slash-tmp is the length between start of the string and the slash */ 
else 
    stripped_url = strdup(tmp); 

printf("domain name = \"%s\"\n", strupped_url); 

free(stripped_url); 
1

あなたは/

char url[]="http://www.google.ie/"; 
char* url_stripped=strtok(url,"/"); 
url_stripped=strtok(NULL,"/"); 
printf("%s\n",url_stripped); 
+0

それは3番目のバックスラッシュですので、strrokを使いたい場合は2番目から最後の行を繰り返してください。 – gnometorule

+0

あなたのコードは 'url_stripped'を2回宣言し、コロンの後に二重のバックスラッシュがあることを忘れてしまいます。 –

+0

@gnometorule strtokは、トークンが繰り返されたときにそのトークンを処理します – Mansuro

3

Cライブラリを使用してトークン化すべきことは、あなたと連携する機能の多くを与えます! まずは、http://www.cplusplus.com/reference/clibrary/cstring/のように、あなたのニーズに合った関数を選ぶことができます。 アルゴリズムを再発明するのではなく、あなたがすでに持っていることをお勧めします! 良い仕事!

1

これを行うにはかなりの方法があります。あなたは、コードが一般的に何をすべきかについて本当に多くのことを指定していませんでした。のように、この文字列で何を分離したいのですか: "http://stackoverflow.com/questions/8387669/c-beginner-split-a-string/"

とにかく、失ってしまったら「のhttp://」と、最後の「/」、私はこのコードを使用することをお勧めします:

char url[] = "http://www.google.ie/"; 
    char url_stripped[100]; 
    sscanf(url, "http://%s", url_stripped);//get new string without the prefix "http://" 
    url_stripped[strlen(url_stripped)-1] = '\0';//delete last charactar (replace with null terminator) 
    printf("%s\n",url_stripped); 

「のsscanf」機能は、このような状況で非常に便利得ることができます。 "fscanf"や "scanf"とよく似ていますが、入力は文字列です。 「char url_stripped [100];」行は、十分なスペースがあることを確認するか、malloc(strlen(url)+1)を使用してください。と自由()。あなたがもう文字列を必要としないとき。

1

私は、次の文字列を持っている: "http://www.google.ie/は" 私は "www.google.ie"

あなたがこれを行うことができますが、文字列を 作成したい(以下コード、最高速度):

#define protocol "http://" 
#define host  "www.google.ie" 
#define slash  "/" 

// "http://www.google.ie/" 
printf("Whole string: %s\n", protocol host slash); 

// "www.google.ie" 
printf("URL only: %s\n", host); 

簡単ですね。

+0

ありがとう、私は正しいために 'ホスト'によって 'url'を置き換えました。 – Gil

1

後半に可能な解決策:

const char* PROTOCOLS[] = { "http://", "https://", 0 }; 
char* url_stripped = 0; 
const char* protocol; 
char* url = *(a_argv + 1); 

for (size_t i = 0; 0 != PROTOCOLS[i]; i++) 
{ 
    protocol = strstr(url, PROTOCOLS[i]); 
    if (protocol == url) /* Ensure starts with and not elsewhere. */ 
    { 
     const char* first_fwd_slash; 
     protocol += strlen(PROTOCOLS[i]); 

     first_fwd_slash = strchr(protocol, '/'); 
     if (0 == first_fwd_slash) 
     { 
      url_stripped = strdup(protocol); 
     } 
     else 
     { 
      const size_t size = first_fwd_slash - protocol + 1; 
      url_stripped = malloc(sizeof(char) * size); 
      memcpy(url_stripped, protocol, size - 1); 
      *(url_stripped + size - 1) = 0; 
     } 
     break; 
    } 
    url_stripped = 0; 
} 

if (0 != url_stripped) 
{ 
    printf("[%s]\n", url_stripped); 
    free(url_stripped); 
} 
1
char* url="http://www.google.ie/"; 
char* url_stripped; 
strcpy(url_stripped,url+7); 
printf("%s\n",url_stripped); 
関連する問題