2016-02-28 19 views
7

私のコードに問題があり、私はあなたの助けが必要です!私がする必要があるのは、www.から始まり、入力された文字列から.eduで終わるWebアドレスを抽出する関数を書くことです。入力された文字列には空白が含まれないため、ここではscanf()がうまく動作するはずです。例えばCの文字列からWebアドレスを抽出する


http://www.school.edu/admission。抽出されたアドレスはwww.school.eduである必要があります。

これは私がこれまでに思いついたことですが、明らかにうまくいかず、残念なことに他のことは考えられません。

void extract(char *s1, char *s2) { 
    int size = 0; 
    char *p, *j; 

    p = s1; 
    j = s2; 
    size = strlen(s1); 

    for(p = s1; p < (s1 + size); p++) { 
     if(*p == 'w' && *(p+1) == 'w' && *(p+2) == 'w' && *(p+3) == '.'){ 
      for(p; p < (p+4); p++) 
       strcat(*j, *p); 
     } 
     else if(*p=='.' && *(p+1)=='e' && *(p+2)=='d' && *(p+3)=='u'){ 
      for(p; (p+1) < (p+4); p++) 
       strcat(*j, *p);      
     } 
    } 
    size = strlen(j); 
    *(j+size+1) = '\0'; 
} 

関数は、ポインタ演算を使用しなければなりません。エラーは、互換性のない型やキャストと関係があります。先にありがとう!

+2

質問に**完全**エラーメッセージを含めてください。それが私たちの多くを助けます。 –

+0

'char'データを' strcat() 'に渡すことは良い考えではありません。 – MikeCAT

+2

'p <(p + 4)'と '(p + 1)<(p + 4)'は、定義されていれば常に真です。 – MikeCAT

答えて

1

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

void extract(char *s1, char *s2) { 
    size_t size = strlen(s1), i = 0; 
    while(memcmp(s1 + i, "www.", 4)){ 
     i++; 
    } 
    while(memcmp(s1 + i, ".edu", 4)){ 
     *s2++ = *(s1 + i); 
     i++; 
    } 
    *s2 = '\0'; 
    strcat(s2, ".edu"); 
} 

int main(void) 
{ 
    char str1[1000] = "http://www.school.edu/admission", str2[1000]; 
    extract(str1, str2); 
    puts(str2); 
} 

:今

#include <stdio.h> 

int main(void) 
{ 
    char str[1000]; 
    sscanf("http://www.school.edu/admission", "%*[^/]%*c%*c%[^/]", str); 
    puts(str); 
} 

は、ここでは、固定のコードを行きますs2は、抽出されたWebアドレスを格納するのに十分な大きさでなければならないこと、またはsegfault 。

-1

残念ながら多くの間違いがあります。 char *を期待するときにcharをstrcatに渡すので、コンパイルが失敗します。たとえそれがクラッシュしてもコンパイルしたとしても。

for(p = s1; p < (s1 + size); p++) { 
    // This if statement will reference beyond s1+size when p=s1+size-2. Consequently it may segfault 
    if(*p=='w' && *(p+1)=='w' && *(p+2)=='w' && *(p+3)=='.') { 
     for(p; p < (p+4); p++) // This is an infinite loop 
      // strcat concatenates one string onto another. 
      // Dereferencing the pointer makes no sense. 
      // This is the likely causing your compilation error. 
      // If this compiled it would almost certainly segfault. 
      strcat(*j, *p); 
    } 
    // This will also reference beyond s1+size. Consequently it may segfault 
    else if(*p=='.' && *(p+1)=='e' && *(p+2)=='d' && *(p+3)=='u') { 
     for(p; (p+1) < (p+4); p++) // This is also an infinite loop 
      // Again strcat expects 2x char* (aka. strings) not 2x char 
      // This will also almost certainly segfault. 
      strcat(*j, *p); 
    } 
} 

// strlen() counts the number of chars until the first '\0' occurrence 
// It is never correct to call strlen() to determine where to add a '\0' string termination character. 
// If the character were actually absent this would almost certainly result in a segfault. 
// As it is strcat() (when called correctly) will add the terminator anyway. 
size = strlen(j); 
*(j+size+1) = '\0'; 

EDIT:これは宿題の質問のように思えるので、私はあなたがこれらの分野であなたの知識を再確認することができますので、あなたの現在のコードが間違っている場合に言及し、より建設的だろうと思いました。

文字列を間接参照し、char *の代わりに2xのcharをstrcat()に渡すので、あなたの正確な質問に対する答えはコンパイルされません。

+0

'if'ステートメントは、短絡評価が演算子' && 'に適用されるため、未定義の動作はありません。この演算子は左から右に評価されるため、評価はNUL文字で停止します。質問によれば、両方のサブストリングがストリング内に含まれていると安全に仮定することもできます。 –

0

これはあなたの問題のための簡単なソリューションです。だから、ほとんどの些細なアプローチがあるかもしれない

char* extract(char *s1) { 
char* ptr_www; 
char* ptr_edu; 
int len ; 
char* s2; 

ptr_www = strstr(s1,"www"); 
ptr_edu = strstr(s1,".edu"); 

len = ptr_edu -ptr_www + 4; 

s2 = malloc (sizeof(char)*len+1); 
strncpy(s2,ptr_www,len); 
s2[len] = '\0'; 
printf ("%s",s2); 

return s2; 
} 
+0

しかし、 "www"か ".edu"、またはその両方が文字列 's1の中にない場合はどうなりますか? –

+0

はい、これを処理するための条件を追加できますが、質問者は住所に「www」と「.ed​​u」を含める必要があると考えています。 – fedi

+0

はい、そうです。私はそれを見落とした。 askerは "www"の後ろに '.'を付けることさえできます。あなたのコードの説明を追加することをお勧めします。 –

関連する問題