2016-02-28 12 views
7

Mam problem z kodem i potrzebuję Twojej pomocy! Muszę napisać funkcję, która wyodrębni adres internetowy zaczynający się od www. i kończy się na .edu z wprowadzonego łańcucha. Wprowadzony ciąg nie będzie zawierał spacji, więc powinien on dobrze działać.Wyodrębnianie adresów internetowych z ciągu znaków w C

Na przykład:
http://www.school.edu/admission. Wyodrębniony adres powinien być www.school.edu.

Oto, do czego do tej pory doszedłem, to oczywiście nie zadziałało i niestety nie mogę wymyślić nic innego.

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

Funkcja musi użyć wskaźnika arytmetyki. Błędy, które otrzymuję, mają coś wspólnego z niekompatybilnymi typami i rzutowaniem. Dzięki!

+2

Proszę podać ** pełny ** komunikat o błędzie w pytaniu. To by nam bardzo pomogło. –

+0

Przekazywanie danych 'char' do' strcat() 'nie jest dobrym pomysłem. – MikeCAT

+2

'p <(p + 4)' i '(p + 1) <(p + 4)' są zawsze prawdziwe, jeśli są zdefiniowane. – MikeCAT

Odpowiedz

1

Więc najbardziej trywialne podejście może być:

#include <stdio.h> 

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

Teraz, tu idzie stały kod:

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

Pamiętaj, że s2 musi być wystarczająco duży, aby zawierać wyodrębniony adres internetowy, lub może pojawić się błąd segfault .

-1

Niestety, jest wiele nie tak. Twoja kompilacja nie działa, ponieważ przekazujesz znak do strcat, gdy oczekuje znaku *. Nawet jeśli skompilowałaby się, gdyby się zawiesiła.

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: Wydaje się to jak pytanie zadanie domowe, więc pomyślałem, że byłoby bardziej konstruktywne wspomnieć gdzie aktualna kod jest nie tak, więc można ponownie sprawdzić swoją wiedzę w tych dziedzinach.

Odpowiedź na twoje dokładne pytanie brzmi: nie kompiluje się, ponieważ usuwasz łańcuch znaków, a zatem przekazujesz 2x char zamiast char * do strcat().

+0

Instrukcja 'if' nie ma niezdefiniowanego zachowania, ponieważ dla operatora' && 'stosowana jest ocena zwarcia. Ponieważ ten operator jest oceniany od lewej do prawej, ocena kończy się po znaku NUL. Zgodnie z tym pytaniem można bezpiecznie założyć, że oba pod-łańcuchy są zawarte w ciągu znaków. –

0

Jest to proste rozwiązanie dla swojego problemu:

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

Ale co jeśli "www" lub ".edu" lub oba nie są w ciągu 's1? –

+0

Tak, możemy dodać pewne warunki, aby sobie z tym poradzić, ale wierzę, że osoba pytająca zakłada, że ​​adres powinien zawierać "www" i ".edu" – fedi

+0

Tak, prawda. Przeoczyłem to. Pytający zakłada nawet "." Po "www". Proponuję dodać objaśnienie Twojego kodu. –

Powiązane problemy