c - सी प्रोग्रामिंग: केवल एफएटीएस से प्रिंट करें



string loops (5)

यह main देखें:

int main(void)
{
    int i;
    int ch;
    char str[512];
    fgets(str, sizeof str, stdin);

    for (i = 0; i <= (strlen(str)); i++)
    {
        if (str[i] != '\0' && str[i] != '\n')
        {
            int num = atoi(&str[i]);
            printf("%d\n", num);
        }
    }

    return 0;
}

मुझे उपयोगकर्ता से नंबरों के साथ लाइन मिलनी है और बिना किसी spaces या tabs सभी नंबर मिलना है।

उदाहरण के लिए:

इनपुट 1 2 3 लेकिन इस मामले में यह उत्पादन:

1
2
2
3
3

तो मुझे 2 और 3 बार दो बार क्यों मिला?

https://src-bin.com


Answer #1

क्योंकि आप स्ट्रिंग की स्थिति भी पास करते हैं जो रिक्त स्थान से शुरू होता है। उन्हें पहली संख्या 2 और 3 होनी चाहिए क्रमशः दो बार। यही लौटा दिया गया है

for (i = 0; i <= (strlen(str)); i++)
{
    if (str[i] != '\0' && !isspace(str[i]) )
    {
        int num = atoi(&str[i]);
        printf("%d\n", num);
    }
}

प्रिंटों:

1
2
3

strtok करने के उद्देश्य के लिए आप strtok उपयोग कर सकते हैं और इसे नंबर strtok में परिवर्तित कर सकते हैं। यह atol/atoi तुलना में त्रुटि मामलों पर बेहतर नियंत्रण प्रदान करता है।


Answer #2

जब यह इनपुट में स्पेस वर्ण तक पहुंचता है तो यह " 2 3" (परिणाम 2 में) और बाद में " 3" (जिसके परिणामस्वरूप 3) पर अत्याधुनिक संख्याएं पैदा करता है, के साथ atoi() को कॉल करेगा।


Answer #3

यहां बताया गया है कि मैं यह कैसे करूँगा:

char line[256];
if (fgets(line, sizeof line, stdin) != NULL)
{
    const char *ptr = line;
    while (*ptr != '\0')
    {
        char *eptr = NULL;
        const long value = strtol(ptr, &eptr, 10);
        if (eptr != ptr)
            printf("%ld\n", value);
        else
            break;
        ptr = eptr;
    }
}

यह strtol() का उपयोग करता है इसलिए यह नकारात्मक संख्याओं को भी संभालता है; अगर यह गलत है तो आप निश्चित रूप से उन्हें फ़िल्टर करने के लिए चेक जोड़ सकते हैं। मुझे लगता है कि यह कुछ भी बेहतर है strtok() का उपयोग करते हुए।


Answer #4

atoi() रेफरी atoi() :

पहले गैर-व्हाट्सपेस के चरित्र में पाया जाने तक आवश्यक फ़ंक्शन सबसे पहले रिक्त स्थान के रूप में कई रिक्त स्थान वर्ण (जारी करने वाले के रूप में) को हटा देता है। [...]

इसका मतलब है कि यदि आप उस समारोह "2" में इनपुट के रूप में देते हैं, तो यह 2 लौटाएगा।

इसे बदलो:

if (str[i] != '\0' && str[i] != '\n')

इसके लिए:

if (str[i] != ' ' && str[i] != '\0' && str[i] != '\n')

और आपको मिलेगा:

1
2
3

यहां इस कोड को डीबग करने के बारे में एक टिप है: आपके आउटपुट में, आपको 2 और 3 बार दो बार मिला है, लेकिन 1 नहीं।

दूसरे शब्दों में, आपको वह संख्या मिलती है जो अंतरिक्ष के बाद दो बार थी। 1 के पास इससे पहले एक स्थान नहीं था

इससे आप को यह करना चाहिए कि रिक्त स्थान के बारे में कुछ डरावना है

दरअसल, आप अगर कथन के शरीर में प्रवेश करेंगे, भले ही str[i] एक स्थान था!

यदि कोई मौजूदा स्टेटर एक स्थान नहीं है, तो यह जांचने के लिए एक शर्त जोड़कर कि if स्टेटमेंट के बॉबी दर्ज करें, आप वास्तव में रिक्त स्थान को छोड़ देते हैं।


Answer #5

आप isdigit या isalpha() फ़ंक्शन (आपके उपयोग के आधार पर) ctype.h में उपलब्ध उपयोग कर सकते हैं। निम्न isdigit फ़ंक्शन का उपयोग करते हुए कोड स्निपेट है:

for (i = 0; i <= (strlen(str)); i++)
{
    if (isdigit(str[i]))
    {
        int num = atoi(&str[i]);
        if(i && str[i-1]=='-') num *= -1;
        printf("%d\n", num);
        i += ( num==0 ) ? 1 : (int)log10(abs(num))+1;
    }
}

इसे यहाँ काम कर देखें
उदाहरण के लिए यहां देखें isdigit और isalpha() फ़ंक्शंस।

आपके प्रश्न के मुताबिक:

तो मुझे 2 और 3 बार दो बार क्यों मिला?

Cplusplus.com पर उपलब्ध निम्नलिखित स्पष्टीकरण देखें, जो atoi() फ़ंक्शन को बताता है।

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





atoi