एक स्ट्रिंग, संख्या, जिसमें अक्षर और अंक हैं, दिए गए स्ट्रिंग में प्रत्येक अंक (0-9) की आवृत्ति पाएं।

'''

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>
#include<ctype.h>

int main() {

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */ 
    char num[20];
    int i;
    int count[15]={0};
  
    scanf("%s",num);
    

    for(i=0;i<10;i++){
        printf("\n");     
        for(int j=0;j<strlen(num);j++){
            if(isdigit(num[j])){
               if(i == num[j]-'0'){
                count[i]+=1;
            }

            }
           
        }
        printf("\nCount %d:%d",i,count[i]);
    }  

    for(i=0;i<10;i++){
        printf("%d ",count[i]);
    } 
    return 0;
}

'''

आउटपुट:

गिनती 0:5

गणना 1:9

गणना 2:5

गणना 3:12

गणना 4:8

गणना 5:11

गणना 6:15

गिनती 7:4

गिनती 8:4

बाहर निकल गया, विभाजन दोष

अंक 9 है या नहीं, यह जाँचते समय यह काम क्यों नहीं कर रहा है?

0
Sowmya 7 अगस्त 2020, 12:54

1 उत्तर

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

अपने आउटपुट को देखते समय, ऐसा लगता है कि आपने 19 वर्णों से अधिक लंबी स्ट्रिंग दर्ज की है। तो आपके कार्यक्रम में अपरिभाषित व्यवहार है।

इस

scanf("%s",num);

ऐसा कुछ है जो आपको कभी नहीं करना चाहिए। इनपुट को अपने बफर के आकार तक सीमित करना याद रखें। अर्थात्:

char num[20];     // Size of buffer is 20

scanf("%19s",num);
        ^^
        At max allow 19 characters so that there is also room for the string termination

या - शायद बेहतर - scanf के बजाय fgets का उपयोग करें। fgets का एक लाभ यह है कि यह बफर आकार को तर्क के रूप में लेता है - फलस्वरूप आप इसे निर्दिष्ट करना कभी नहीं भूलते।

यह भी ध्यान दें कि आपका बाहरी for लूप अनावश्यक है। आप एकल लूप का उपयोग करके सीधे सरणी को अपडेट कर सकते हैं।

// for(i=0;i<10;i++){  Delete this - it's not needed

    for(int j=0;j<strlen(num);j++)
    {
        if(isdigit(num[j]))
        {
            count[num[j]-'0']+=1;  // Update array
        }
    }

बीटीडब्लू: आपको काउंटर में केवल 10 तत्वों की आवश्यकता है, यानी।

int count[15]={0};   --->  int count[10]={0};
0
4386427 7 अगस्त 2020, 13:22