2016-02-28 19 views
7

Ho problemi con il mio codice e ho bisogno del vostro aiuto! Quello che devo fare è scrivere una funzione che estrae l'indirizzo web che inizia da www. e termina con .edu da una stringa immessa. La stringa inserita non avrà spazi al suo interno, quindi scanf() dovrebbe funzionare bene qui.Estrazione di indirizzi Web da una stringa in C

Ad esempio:
http://www.school.edu/admission. L'indirizzo estratto dovrebbe essere www.school.edu.

Questo è quello che ho inventato finora, ovviamente non ha funzionato, e non posso pensare ad altro, sfortunatamente.

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

La funzione deve utilizzare puntatori. Gli errori che ho hanno a che fare con tipi e casting incompatibili. Grazie in anticipo!

+2

Si prega di includere il messaggio di errore ** completo ** nella domanda. Questo ci aiuterebbe molto. –

+0

Il passaggio dei dati 'char' a' strcat() 'non è una buona idea. – MikeCAT

+2

'p <(p + 4)' e '(p + 1) <(p + 4)' sono sempre veri se sono definiti. – MikeCAT

risposta

1

Quindi l'approccio più semplice potrebbe essere:

#include <stdio.h> 

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

Ora, qui va il codice fisso:

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

Notare che s2 deve essere abbastanza grande da contenere l'indirizzo Web estratto, oppure si può ottenere un segfault .

-1

Sfortunatamente c'è molto sbagliato. La compilazione fallisce perché si passa un char a strcat quando si aspetta un char *. Anche se fosse compilato anche se si sarebbe schiantato.

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: Questo mi sembra una domanda compiti a casa, così ho pensato che sarebbe stato più costruttivo di menzionare in cui il vostro codice attuale sta andando male, in modo da poter ricontrollare la vostra conoscenza in quelle zone.

La risposta alla tua domanda esatta è che non si compila perché si denota la stringa e quindi si passa 2x char invece di char * a strcat().

+0

Le istruzioni 'if' non hanno un comportamento indefinito perché la valutazione di cortocircuito è applicata all'operatore' && '. Poiché questo operatore viene valutato da sinistra a destra, la valutazione si ferma proprio sul carattere NUL. Secondo la domanda, si può anche presumere che entrambe le sottostringhe siano contenute all'interno della stringa. –

0

Questa è una soluzione facile per il vostro problema:

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

Ma, se "www" o ".edu" o entrambi non sono nella stringa 's1? –

+0

Sì, possiamo aggiungere alcune condizioni per gestirlo, ma ritengo che il richiedente presupponga che l'indirizzo debba contenere "www" e ".edu" – fedi

+0

Sì, giusto. L'ho trascurato. Il richiedente assume anche un "." Dopo "www". Suggerisco di aggiungere qualche spiegazione del tuo codice. –