2011-05-16 11 views
5

में लॉजिकल त्रुटि को समझने में सक्षम नहीं है एक प्रोग्राम जो प्रति इनपुट एक शब्द को एक पंक्ति प्रिंट करता है।सी प्रोग्राम

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c== ' ' || c== '\n' ||c == '\t') 
       putchar('\n'); 
     else { 
      putchar(c); 
     } 
    } 
    return 0; 
} 

उपरोक्त प्रोग्राम परिणाम को सही ढंग से प्रिंट करता है, प्रति पंक्ति एक शब्द। तदनुसार स्थिति को बदलने के बाद, मैं नीचे दिए गए कार्यक्रम की प्रति पंक्ति एक शब्द प्रिंट करने की उम्मीद कर रहा था। हालांकि मुझे सही परिणाम नहीं मिल रहा है। क्या मैं कुछ मूर्खतापूर्ण गलती कर रहा हूं या कुछ गलत है?

int main() { 

    int c; 

    while ((c=getchar()) != EOF) { 

     if (c != ' ' || c != '\n' || c != '\t') 
      putchar(c); 
     else { 
      putchar('\n'); 
     } 
    } 

    return 0; 

} 

उत्तर

16

हालत का सही परिवर्तन है:

if (!(c == ' ' || c == '\n' || c == '\t')) 

या

if (c != ' ' && c != '\n' && c != '\t') 

यानी बदल देखें De Morgan's law

+2

डी मॉर्गन के कानून –

+0

@ पॉल आर और अनाम - लिंक के लिंक के लिए +1; – MByD

+0

@che - धन्यवाद। मैंने इसके बारे में सोचा था लेकिन उस के लिए संपादित करने के लिए बहुत आलसी था :) – MByD

3

आप && रों को || रों बदलने की जरूरत है,

 if (c != ' ' || c != '\n' || c != '\t') 

 if (c != ' ' && c != '\n' && c != '\t') 

यानी "यदि ग अंतरिक्ष के बराबर नहीं और वापस जाने के लिए समान नहीं सी और टैब तब के बराबर नहीं है ..."

1

आप क्या कर सकते हैं MByD ने कहा, या करने के लिए आप अपने या (||) को और (& &) बदल सकते हैं।

0

त्रुटि आपकी सशर्त अभिव्यक्ति में है। जब आप पहली बार अभिव्यक्ति नकारना

!(c== ' ' || c== '\n' ||c == '\t') 

आपको मिलेगा:

c!= ' ' && c!= '\n' &&c != '\t' 

और आप अपने प्रश्न में परिभाषित नहीं।

याद रखें:

(ए & & बी) के रूप में ही है (! एक || बी)

0

A or B or C के विपरीत not A and not B and not C है, इसलिए का उपयोग करें:

if(c != ' ' && c != '\n' && c != '\t') 
2

याद रखें आपके तर्क प्रोग्रामिंग कक्षाएं:

!(A || B) == (!A && !B) 
!(A && B) == (!A || !B) 

दूसरे शब्दों में: अपनी हालत इस तरह पढ़ने के लिए की जरूरत है:

if (c != ' ' && c != '\n' && c != '\t') 
0

आप DeMorgan's Laws पर थोड़ा और अध्ययन करने के लिए की जरूरत है। संयोजन ऑपरेटर को "||" से बदलने के लिए पर्याप्त नहीं है "& &" पर, आपको उसी समाधान सेट को प्राप्त करने के लिए संयुक्त सभी तत्वों को भी अस्वीकार करना होगा।

4

आपको अपने मूल प्रश्न के कई जवाब मिल गए हैं, लेकिन मुझे लगता है कि एक मामूली विस्तार जोड़ने के लिए बाध्य होना चाहिए: मूल और संशोधित संस्करण दोनों जो कुछ मैं समस्याओं पर विचार करता हूं उससे पीड़ित हूं।सबसे पहले, वे वास्तव में सफेद-स्थान को सही ढंग से नहीं पहचानते हैं (उदाहरण के लिए, वे लंबवत टैब को अनदेखा करते हैं, और लोकेल द्वारा परिभाषित किसी भी अन्य सफेद-स्थान को अनदेखा करते हैं), और यदि वे एक से अधिक सफेद-स्पेस वर्ण से अलग होते हैं तो वे रिक्त रेखाएं उत्पन्न करते हैं ।

पहली समस्या के लिए, मैं उन सफेद-स्पेस वर्णों की तुलना करने के बजाय isspace का उपयोग करता हूं, जो आप जानते हैं (आकस्मिक रूप से, आपके सामने आने वाली समस्या के स्रोत को समाप्त करना)। दूसरे के लिए, जब आप पहली बार सामना करते हैं तो आप लगातार सभी सफेद-स्पेस वर्णों को छोड़ने के लिए कुछ तर्क जोड़ सकते हैं, या यदि आप वर्तमान वर्ण एक स्पेस और पर एक नई लाइन लिखने के लिए ध्वज जोड़ सकते हैं आपके द्वारा लिखे गए पिछले चरित्र को एक नई लाइन नहीं थी।

वैकल्पिक रूप से, आप शब्दों %s रूपांतरण के साथ scanf का उपयोग कर पढ़ सकते हैं:

char buffer[256]; 

while (scanf("%255s", buffer)) 
    printf("%s\n", buffer); 

यह दृष्टिकोण, तथापि, एक शब्द के आकार पर एक ऊपरी सीमा लगाता है। सामान्य परिस्थितियों में, यह शायद ही कभी समस्या है, लेकिन इनपुट की प्रकृति के आधार पर यह हो सकता है/हो सकता है।

+0

के लिए धन्यवाद प्रोग्राममे के साथ समस्याओं को साझा करना। मैं इसे भी कोशिश करूंगा। – bornfree

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