मैं सी भाषा में निम्नलिखित समस्या को हल करने की कोशिश कर रहा हूँ। इनपुट को स्ट्रिंग्स के रूप में लिया जाता है और उपयोगकर्ता प्रत्येक स्ट्रिंग को नई लाइन में दर्ज करता है। जब उपयोगकर्ता "END" में प्रवेश करता है, तो प्रोग्राम को इनपुट लेना बंद कर देना चाहिए और लाइनों, शब्दों और वर्णों की संख्या प्रदर्शित करनी चाहिए। इसे प्राप्त करने के लिए मैंने निम्नलिखित कोड लिखा:

#include<stdio.h>  
#include<string.h>
void main(){
 char a[100], b = {'E', 'N', 'D'};
 int i, k, word = 0, chr = 0, line = 0 ;
 printf("Enter paragraph (enter END to stop)\n");
 gets(a);
 k = strcmp(a,b);
 while (k != 0 ){
    line++;
    for (i = 0; a[i] != '\0'; i++){
        if (a[i] == ' ')
           word++;
        else 
            chr++;
     }
     gets(a);
     k = strcmp(a,b);

   }
  printf("%d %d %d\n", line, word, chr );
 }

उपरोक्त कोड में मैंने माना कि उपयोगकर्ता शब्दों के बीच रिक्त स्थान देने के लिए केवल स्पेस बटन का उपयोग कर रहा है। समस्या यह थी कि जैसे ही मैं पहला इनपुट देता हूं मुझे एक त्रुटि संदेश मिलता है जिसमें कहा गया है कि प्रोग्राम ने काम करना बंद कर दिया है।

मैं यह नहीं देख पा रहा हूं कि मेरा तर्क गलत है या वाक्य रचना का मेरा उपयोग गलत है।

0
Infinity_hunter 27 सितंबर 2020, 13:33

1 उत्तर

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

परिवर्तनीय घोषणा में

 char a[100], b = {'E', 'N', 'D'};

b को अदिश के रूप में घोषित किया गया है। यह strcmp(a,b) में सेगमेंटेशन फॉल्ट की ओर ले जाएगा क्योंकि strcmp() के दोनों तर्क पॉइंटर्स होने चाहिए।

यह होना चाहिए

 char a[100], b[] = "END";

आपको b को एक सरणी बनाने के लिए [] जोड़ना होगा और आपको प्रत्येक वर्ण को अलग-अलग रखने की आवश्यकता नहीं है। स्ट्रिंग लिटरल स्टाइल इनिशियलाइज़ेशन का उपयोग करने से कंपाइलर ऐड टर्मिनेटिंग नल-कैरेक्टर भी होता है ताकि आप इसे strcmp() सुरक्षित रूप से पास कर सकें।

एक और नोट यह है कि आपको gets() का उपयोग नहीं करना चाहिए, जिसमें बफर ओवररन का अपरिहार्य जोखिम है, जिसे C99 में हटा दिया गया है और C11 से हटा दिया गया है। आप fgets() का उपयोग कर सकते हैं, जो इसके बजाय बफ़र की लंबाई निर्दिष्ट कर सकता है। fgets() न्यूलाइन कैरेक्टर को स्टोर करता है जबकि gets() नहीं करता है, इसलिए आपको इसे मैन्युअल रूप से हटाना होगा। यह इस तरह किया जा सकता है, उदाहरण के लिए।

char a[100];
char *lf;
fgets(a, sizeof(a), stdin);
if ((lf = strchr(a, '\n')) != NULL) *lf = '\0';

इसके अलावा, मेरा सुझाव है कि आपको void main() के बजाय होस्ट किए गए वातावरण में मानक int main(void) का उपयोग करना चाहिए, जो कि C89 में अवैध है और C99 या बाद में कार्यान्वयन-परिभाषित है, जब तक कि आपके पास गैर-मानक हस्ताक्षर का उपयोग करने का कोई विशेष कारण न हो।

2
MikeCAT 27 सितंबर 2020, 13:41