सी

2016-02-28 3 views
7

में एक स्ट्रिंग से वेब पते निकालने में मुझे अपने कोड में परेशानी है और मुझे आपकी मदद चाहिए! मुझे ऐसा करने की ज़रूरत है जो एक ऐसा फ़ंक्शन लिखना है जो www. से शुरू होने वाले वेब पते को निकालेगा और एक इनपुट स्ट्रिंग से .edu के साथ समाप्त होता है। इनपुट स्ट्रिंग में इसमें कोई रिक्त स्थान नहीं होगा, इसलिए scanf() यहां अच्छी तरह से काम करना चाहिए।सी

उदाहरण के लिए:
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

'पी <(पी + 4)' और '(पी + 1) <(पी + 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 निकाले गए वेब पते को रखने के लिए पर्याप्त होना चाहिए, या आप segfault प्राप्त कर सकते हैं ।

-1

दुर्भाग्य से बहुत गलत है। आपका संकलन विफल हो रहा है क्योंकि जब आप char * की अपेक्षा करते हैं तो आप चार को स्ट्रैट पर पास करते हैं। भले ही यह संकलित हो गया हो, हालांकि यह दुर्घटनाग्रस्त हो जाएगा।

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

संपादित करें: यह एक होमवर्क सवाल की तरह लगता है, इसलिए मैंने सोचा कि इसे और अधिक जहां अपने वर्तमान कोड गलत हो रहा है उल्लेख करने के लिए रचनात्मक होगा, इसलिए आप उन क्षेत्रों में अपने ज्ञान को पुनः जाँच कर सकते हैं।

आपके सटीक प्रश्न का उत्तर यह संकलित नहीं करता है क्योंकि आप स्ट्रिंग को कम करते हैं और इसलिए char * के बजाय strx() के बजाय 2x char पास करते हैं।

+0

'if' कथनों में कोई अपरिभाषित व्यवहार नहीं है क्योंकि ऑपरेटर '&&' के लिए शॉर्ट सर्किट मूल्यांकन लागू किया जाता है। चूंकि इस ऑपरेटर का मूल्यांकन बाएं से दाएं से किया जाता है, मूल्यांकन केवल एनयूएल चरित्र पर बंद हो जाता है। प्रश्न के मुताबिक, कोई भी सुरक्षित रूप से यह मान सकता है कि दोनों उप-तार स्ट्रिंग के भीतर निहित हैं। –

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" और ".edu" – fedi

+0

होना चाहिए, ठीक है। मैंने इसे अनदेखा किया। पूछताछकर्ता भी "www" के बाद ''' मानता है। मैं आपके कोड की कुछ स्पष्टीकरण जोड़ने का सुझाव देता हूं। –