2016-01-29 2 views
5

एक पैटर्न मान्यता कार्यक्रम को इनपुट पैटर्न खोजने पर पाटर युक्त सभी पंक्तियों को मुद्रित करना होगा। यदि इनपुट -x पैटर्न मिलता है, तो प्रोग्राम को पैटर्न वाली रेखाओं को छोड़कर सभी पंक्तियों को मुद्रित करना होगा।के एंड आर 2 की धारा 5.10 में स्पष्टीकरण

// ..... 
switch(c) 
{ 
case 'x': 
    except=1; 
    break; 
// ...... 
} 

// ...... 
while(getline(line,MAXLINE)>0) 
    { 
    line_num++; 
    if((strstr(line,*argv)!=NULL) != except) 
     { 
     if(number) 
      printf("%ld:",linenum); 
     printf("%s",line); 
     found++; 
     } 
    } 
// ...... 

कश्मीर & आर से उपरोक्त कोड में छोड़कर या तो 1 हो सकता है या 0. कैसे if(strstr...) ब्लॉक कार्य प्रभावी ढंग -x को संभालने के लिए करता है?

+0

मुझे प्रश्न समझ में नहीं आया। क्या आप विस्तार से समझा सकते हैं? –

+0

क्या आप 'छोड़कर' की परिभाषा और प्रारंभिकरण दिखाने के लिए अपना प्रश्न अपडेट कर सकते हैं? –

उत्तर

3

तर्क सरल है। यदि पैटर्न "-x" है तो हमें उन सभी पंक्तियों को मुद्रित करना चाहिए जिनमें पैटर्न नहीं है।

इस पैटर्न के लिए except1 के बराबर है।

तो लाइनों कि पैटर्न होते हालत

strstr(line,*argv)!=NULL 

है कि इस हालत हमेशा 1 के बराबर है, तो एक लाइन पैटर्न शामिल हो जाएगा पूरा करते हैं।

इस प्रकार यदि except 1 के बराबर है और स्थिति strstr(line,*argv)!=NULL 1 के बराबर है तो हमें पैटर्न को छोड़ना चाहिए।

अन्यथा अगर हालत strstr(line,*argv)!=NULL नहीं 1 के बराबर है कि अगर पैटर्न तो नहीं पाया जाता है

if((strstr(line,*argv)!=NULL) != except) 

सच पैदावार और उसके यौगिक बयान निष्पादित किया जाता है अगर बयान।

दूसरी ओर अगर except प्राप्त करने के लिए है कि अगर बयान में हालत सच का मूल्यांकन होगा कि हम जरूरत है कि हालत strstr(line,*argv)!=NULL 1.

बराबर होगा वास्तव में आप को फिर से लिखने कर सकते हैं तो 0 के बराबर है अगर बयान

if((strstr(line,*argv)!=NULL) != except) 

नीचे दिए तरीक़े

if(((strstr(line,*argv) != NULL) == 1 && except == 0) || 
    ((strstr(line,*argv) != NULL) == 0 && except == 1)) 

फौरन बोल यदि या तो

1 and 0 

या

0 and 1 

या तो

तो
1 and 1 

या

0 and 0 

तो बयान निष्पादित अगर बयान काम करता है अगर नहीं किया जाएगा।

यहां 1 और 0 अगर कथन में दो उप अभिव्यक्तियों का मूल्यांकन करने के परिणाम हैं।

3

मैं कोड से परिचित नहीं हूँ, लेकिन इस बयान एक बूलियन (0 या 1) strstr() के रूप में के रूप में मूल्यांकित शब्द के लिए सूचक वापस आ जाएगी जाएगा NULL के लिए या खोजा जा रहा है, तो नहीं मिला:

strstr(line, *argv) != NULL 

तो मुझे लगता है कि except "पाया नहीं गया" या "पाया गया" स्थिति को प्रभावित करने के लिए 0 या 1 पर सेट किया गया है।

तो -x पारित नहीं किया जाता है तो except0 है:

if ((strstr(line, *argv) != NULL) != 0) 

अगर शब्द मिला था जिसका अर्थ है if खंड दर्ज करें।

तो -x तो पारित हो जाता है except1 है:

if ((strstr(line, *argv) != NULL) != 1) 

जिसका मतलब है कि अगर शब्द मिला था if खंड में प्रवेश नहीं करते।

यह भ्रामक कोड है, तो मैं करने के लिए यह टूट की सिफारिश करेंगे:

const char *word = strstr(line,*argv); 
int wasfound = word != NULL; 
if (wasfound != except) 
{ 

} 

और फिर एक डिबगर के साथ के माध्यम से कदम। डीबगर का उपयोग करना सीखना भी महत्वपूर्ण है।

0

!= ऑपरेटर के पास एक्सओआर ऑपरेशन के समान सत्य मूल्य है। तो तुम

if((strstr(line,*argv)!=NULL) != except) 
    { 
    if(number) 
     printf("%ld:",linenum); 
    printf("%s",line); 
    found++; 
    } 
में

(कम कुशल लेकिन शायद और अधिक स्पष्ट)

char found_one_match; 
if(strstr(line,*argv) != NULL) 
{ 
    found_one_match = 1; 
} 
else 
{ 
    found_one_match = 0; 
} 
found_one_match ^= except; 
if (found_one_match) 
{ 
    if(number) 
     printf("%ld:",linenum); 
    printf("%s",line); 
} 
found += found_one_match; 

दूसरे शब्दों में, except क्या होता है जब एक पैटर्न स्ट्रिंग में पाया जाता है के प्रभाव को उलट को तोड़ सकता है।

संबंधित मुद्दे