मैं एक स्ट्रिंग तुलना फ़ंक्शन को लागू करने का प्रयास कर रहा हूं जहां मैं एक बूल मान वापस करना चाहता हूं लेकिन मुझे कई त्रुटियां मिल रही हैं और मुझे नहीं पता कि ऐसा क्यों है।

संकलक जो त्रुटि दिखाता है वह है

"error: unknown type name bool" 
&
"error: false, true undeclared" 

अब जहाँ तक मुझे पता है, बूल के केवल दो मान हैं अर्थात सत्य या असत्य, फिर मुझे अभी भी समस्या क्यों हो रही है?

bool string_cmp(char word1[],char word2[]){
    bool  isEqual = false;
    int i,k=sizeof(word1);
    for(i=0;i<=k;i++){
        if(word1[i]!=word2[i]){
            isEqual=false;
        }
        else
            isEqual=true;
            break;
    }
    return isEqual;
}

संपादित कोड (जब मैं शब्द 1 सरणी में और शब्द जोड़ रहा हूं तो मेरा आउटपुट गलत क्यों है?):

bool string_cmp(char word1[],char word2[]){
    bool  isEqual = false;
    int i,k=sizeof(word1);
    for(i=0;i<=k;i++){
        if(word1[i]!=word2[i]){
            isEqual=false;
            break;
        }
        else
            isEqual=true;
    }
    return isEqual;
}

int main()
{
    int count;
    bool cmp;
    char word1[40]={"Hi world world"},word2[20]={"Hi world"},result[60]; //the only case when I am getting wrong output; otherwise if both words are same or if I remove something from word2, I get the output as expected.
    cmp=string_cmp(word1,word2);
    printf("%d",cmp);
}
c
-1
Gagan Batra 27 मार्च 2020, 08:56
1
bool एक अंतर्निर्मित प्रकार नहीं है। इसे देखें: बूलियन-वैल्यू-इन-सी
 – 
user218867
27 मार्च 2020, 09:03
2
आपकी अन्य स्थिति में कई कथन हैं। आपको ब्रेसिज़ जोड़ने की जरूरत है। आप मज़बूती से शब्द 1 का आकार प्राप्त नहीं कर सकते। आपको strlen() का उपयोग करके लंबाई मिलनी चाहिए। i<= एक त्रुटि से बंद हो जाएगा। इसे < में बदलें। यदि स्थिति में आपको जल्दी समाप्त कर देना चाहिए।
 – 
Rafael
27 मार्च 2020, 09:04
1
k=sizeof(word1) k=strlen(word1); होना चाहिए और आपके लूप में तर्क त्रुटियां भी हैं
 – 
M.M
27 मार्च 2020, 10:04

2 जवाब

सबसे बढ़िया उत्तर

आप को करना पड़ेगा:

#include <stdbool.h> 

सी कार्यक्रमों में बूल प्रकार और सही/गलत परिभाषाओं तक पहुंच प्राप्त करने के लिए।

2
bahij zeineh 27 मार्च 2020, 09:01
यह linux और mac पर stdbool.h है। विंडोज़ के बारे में निश्चित रूप से नहीं कह सकता
 – 
bahij zeineh
27 मार्च 2020, 09:03
कल्पना मत करो यह अलग होगा
 – 
bahij zeineh
27 मार्च 2020, 09:03
3
Stdbool.h एक मानक सी हेडर है, यह किसी भी प्लेटफॉर्म पर अलग कैसे हो सकता है?
 – 
phuclv
27 मार्च 2020, 09:06
हाँ, इसका "#include", उत्तर भी मिला। धन्यवाद
 – 
Gagan Batra
27 मार्च 2020, 09:06

C++ में, bool, true और false कीवर्ड हैं और हर जगह उपलब्ध हैं। सी में ऐसा नहीं है।

C को केवल C99 मानक के साथ बूलियन प्रकारों के लिए भाषा समर्थन मिला, जिसने कीवर्ड _Bool को पेश किया। कोई true या false कीवर्ड नहीं हैं, क्योंकि C ऐतिहासिक रूप से इसके बजाय 1 और 0 का उपयोग करता है।

हालांकि सी हेडर stdbool.h प्रदान करता है, जिसमें मैक्रोज़ bool, true और false शामिल हैं:

  • bool मैक्रो _Bool तक फैलता है।
  • true मैक्रो 1 तक फैलता है।
  • false मैक्रो 0 तक फैलता है।

इस हेडर का उपयोग सी कोड को उसी प्रकार के नामों का उपयोग करके सी कोड लिखने के लिए किया जा सकता है जैसे सी ++ में। true/false आमतौर पर 1/0 की तुलना में अधिक पठनीय है, इसलिए हमेशा stdbool.h का उपयोग करना एक अच्छा अभ्यास है।


कृपया अपने कोड में निम्नलिखित बग भी नोट करें:

  • k=sizeof(word1) काम नहीं करता क्योंकि word1 एक ऐरे नहीं है बल्कि एक ऐरे है जो एक पॉइंटर में क्षय हो गया है। आपको इसके बजाय strlen का उपयोग करना चाहिए।
  • लेकिन आपका एल्गोरिदम पूरी जगह पर है ... यदि पहले अक्षर मेल खाते हैं, तो पूरे स्ट्रिंग की तुलना करने के बजाय आप फ़ंक्शन छोड़ देते हैं। strcmp के अपने स्वयं के संस्करण को लागू करने का सही तरीका कुछ इस तरह है:

    int my_strcmp (const char* s1, const char* s2)
    {
      while (*s1 != '\0' && (*s1 == *s2))
      {
        s1++; 
        s2++;
      }
      return (int)*s1 - (int)*s2;
    }
    

(ध्यान दें कि यह एक सरल कार्यान्वयन है, छात्रों के लिए काफी अच्छा है लेकिन मानक पुस्तकालय गुणवत्ता के लिए पर्याप्त नहीं है।)

0
Lundin 27 मार्च 2020, 10:31
स्पष्टीकरण के लिए धन्यवाद, हालांकि मैं किसी वास्तविक स्ट्रिंग फ़ंक्शन और पॉइंटर्स का उपयोग किए बिना string_compare फ़ंक्शन को लागू करने का प्रयास कर रहा था। जब मैं समान शब्दों को पास कर रहा हूं, तो यह मुझे एक मान 1 देता है, जब मैं शब्द 2 बदल रहा होता हूं, तो यह मुझे मान 0 देता है, जैसा कि मैं उम्मीद कर रहा हूं। लेकिन एकमात्र बिंदु जब मुझे गलत मान मिल रहा है, जब मैं "वर्ड 1" में एक शब्द अधिक लिख रहा हूं, तब भी यह मुझे मान 1 देता है, हालांकि वे बराबर नहीं हैं और शून्य देना चाहिए। मैं अपने प्रश्न में संपादित कोड जोड़ रहा हूं।
 – 
Gagan Batra
28 मार्च 2020, 06:00
तो यह कोड क्या है जिसे मैंने यहां पोस्ट किया है?
 – 
Lundin
30 मार्च 2020, 09:31
यदि आप मेरी टिप्पणी को ठीक से देखते हैं, तो मैंने कहा "वास्तविक स्ट्रिंग फ़ंक्शंस और पॉइंटर का उपयोग किए बिना"
 – 
Gagan Batra
31 मार्च 2020, 17:31