C भाषा sscanf को प्रयोग, अनुप्रयोग र सावधानीको पूर्ण व्याख्या【शुरूवातकोड सहित】

目次

1. परिचय

C भाषा मा स्ट्रिङ विश्लेषण गरी, विशेष डेटा निकाल्न उपयोगी कार्यको रूपमा sscanf उपलब्ध छ। यस लेखमा, sscanf को आधारभूत प्रयोगबाट उन्नत प्रयोग, ध्यान दिनुपर्ने बुँदासम्म विस्तृत रूपमा व्याख्या गर्नेछौं।

C भाषा सिक्दै गर्दा, 「प्रयोगकर्ताले इनपुट गरेको डेटा प्रक्रिया गर्न चाहन्छु」「स्ट्रिङबाट संख्यात्मक मान निकाल्न चाहन्छु」 जस्ता परिस्थितिहरू धेरै देखिन सक्छ।scanf सँगको भिन्नता बुझेर, उपयुक्त रूपमा sscanf प्रयोग गर्दा, अझ सुरक्षित र लचिलो प्रोग्राम बनाउन सकिन्छ।

यस लेखमा, तलका बुँदाहरूलाई व्याख्या गर्नेछौं।

  • sscanf कार्यको आधारभूत
  • sscanf को प्रयोग(नमूना कोड सहित)
  • sscanf प्रयोग गरेर उन्नत प्रविधिहरू
  • सामान्य त्रुटिहरू र तिनीहरूको समाधान
  • sscanf सुरक्षित रूपमा प्रयोग गर्नका लागि ध्यान दिनुपर्ने बुँदाहरू

त्यसैले, पहिले sscanf को आधारभूत भूमिका हेर्नुहोस्।

2. C gengo sscanf कार्य के हो?

2.1 sscanf को सारांश

sscanf ले, C gengo को मानक लाइब्रेरीमा समावेश गरिएको कार्य हो, जसले स्ट्रिङलाई विश्लेषण गरी, निर्दिष्ट डेटा प्रकारमा रूपान्तरण गर्न प्रयोग गरिन्छ।scanf सँग समान छ, तर sscanf ले मानक इनपुट होइन, स्ट्रिङबाट डेटा प्राप्त गर्ने बिन्दुमा फरक छ।

2.2 sscanf को मूल संरचना

sscanf को मूल स्वरूप तलको जस्तै हुन्छ।

int sscanf(const char *str, const char *format, ...);
  • str: विश्लेषणको लक्ष्य स्ट्रिङ
  • format: फरम्याट निर्दिष्टकर्ता (डेटा प्रकार परिभाषित)
  • ...: रूपान्तरण गरिएको मानलाई संग्रह गर्ने भेरिएबल (प्वाइन्टर)

रिटर्न मानको रूपमा, रूपान्तरण सफल भएको इनपुट आइटमको संख्या फिर्ता गर्छ। असफल भएमा 0 वा EOF-1)फिर्ता गर्छ।

2.3 scanf सँगको भिन्नता

sscanfscanf को भिन्नता तालिकामा व्यवस्थित गर्दा, तलको जस्तै हुन्छ।

आइटमsscanfscanf
इनपुट स्रोतस्ट्रिङमानक इनपुट(किबोर्ड)
उपयोगअवस्थित स्ट्रिङलाई विश्लेषणप्रयोगकर्ता इनपुट लिने
लचिलोपनउच्च(फरम्याट निर्दिष्ट गर्न सकिने)निम्न(इनपुटमा प्रतिबन्ध छ)
सुरक्षासुरक्षा कम(बफर ओभरफ्लो जोखिम)इनपुट नियन्त्रण कठिन
त्रुटि ह्यान्डलिङरिटर्न मान प्रयोग गरेर उपयुक्त रूपमा प्रक्रिया गर्न सकिन्छमानक इनपुटको कारण, रियल‑टाइम प्रोसेसिङ आवश्यक

यसरी, sscanf ले अवस्थित स्ट्रिङलाई विश्लेषण गर्न उपयुक्त छ, र मानक इनपुटसँग फरक प्रयोग हुन्छ।

年収訴求

3. sscanf को मूलभूत प्रयोग (नमूना कोड सहित)

sscanf को प्रयोग गरेर, स्ट्रिङबाट पूर्णांक, फ्लोटिङ पोइन्ट संख्या, स्ट्रिङ आदि मानहरू प्राप्त गर्न सकिन्छ। यहाँ, मूलभूत प्रयोगलाई व्याख्या गरी, नमूना कोडसँगै प्रस्तुत गर्दछौं।

3.1 sscanf को मूल संरचना

sscanf को प्रयोग गर्दा मूलभूत संरचना तलको जस्तै हुन्छ।

int sscanf(const char *str, const char *format, ...);
  • str: विश्लेषणको लक्ष्य स्ट्रिङ
  • format: ढाँचा निर्दिष्टकर्ता (%d, %f, %s आदि)
  • ...: डेटा भण्डारण गर्ने चलको पोइन्टर

रिटर्न मानको रूपमा, रूपान्तरण सफल भएको इनपुट आइटमको संख्या फिर्ता गर्दछ। त्रुटि भएमा 0 वा EOF-1)फिर्ता गर्दछ।

3.2 स्ट्रिङबाट पूर्णांक प्राप्त गर्ने

sscanf को प्रयोग गरेर, स्ट्रिङभित्रबाट पूर्णांक प्राप्त गर्ने तरिका हेरौं।

#include <stdio.h>

int main() {
    char str[] = "123";
    int num;

    sscanf(str, "%d", &num);
    printf("प्राप्त गरिएको संख्या: %dn", num);

    return 0;
}

आउटपुट परिणाम

प्राप्त गरिएको संख्या: 123

यसरी, "%d" निर्दिष्ट गरेर, स्ट्रिङ "123" बाट पूर्णांक 123 प्राप्त गर्न सकिन्छ।

3.3 स्ट्रिङबाट बहु मानहरू प्राप्त गर्ने

sscanf को प्रयोग गर्दा, एकै स्ट्रिङबाट बहु मानहरू प्राप्त गर्न पनि सम्भव हुन्छ।

#include <stdio.h>

int main() {
    char str[] = "100 200";
    int a, b;

    sscanf(str, "%d %d", &a, &b);
    printf("a = %d, b = %dn", a, b);

    return 0;
}

आउटपुट परिणाम

a = 100, b = 200

स्पेसले विभाजित डेटा विश्लेषण गर्दा उपयोगी हुन्छ।

3.4 स्ट्रिङ र संख्यालाई एकै साथ प्राप्त गर्ने

अर्को, sscanf को प्रयोग गरेर, स्ट्रिङ र संख्याको दुवैलाई विश्लेषण गर्ने तरिका प्रस्तुत गर्दछौं।

#include <stdio.h>

int main() {
    char str[] = "name: John age: 30";
    char name[50];
    int age;

    sscanf(str, "name: %s age: %d", name, &age);
    printf("नाम: %s, उमेर: %dn", name, age);

    return 0;
}

आउटपुट परिणाम

नाम: John, उमेर: 30

यसरी, %s%d लाई संयोजन गरेर, स्ट्रिङ र संख्यालाई एकै साथ प्राप्त गर्न सकिन्छ।

3.5 sscanf को रिटर्न मानको उपयोग

sscanf को रिटर्न मान जाँच गरेर, विश्लेषण सफल भयो कि भएन भन्ने निर्धारण गर्न सकिन्छ।

#include <stdio.h>

int main() {
    char str[] = "42";
    int num;
    int result = sscanf(str, "%d", &num);

    if (result == 1) {
        printf("प्राप्ति सफल: %dn", num);
    } else {
        printf("प्राप्ति असफलn");
    }

    return 0;
}

आउटपुट परिणाम

प्राप्ति सफल: 42

रिटर्न मान 1 ले एउटा मान सफलतापूर्वक प्राप्त भएको देखाउँछ। असफल हुँदा 0 वा EOF हुन्छ, त्यसैले उपयुक्त त्रुटि ह्यान्डलिंग सम्भव हुन्छ।

3.6 सारांश

  • sscanf को प्रयोग गर्दा, स्ट्रिङबाट पूर्णांक, फ्लोटिङ पोइन्ट संख्या, स्ट्रिङ आदि प्राप्त गर्न सकिन्छ।
  • बहु डेटा एकै साथ प्राप्त गर्न पनि सम्भव।
  • sscanf को रिटर्न मान जाँच गरेर, त्रुटि ह्यान्डलिंग गर्न सकिन्छ।

4. sscanf को अनुप्रयोग प्रविधि

sscanf मूलभूत संख्यात्मक वा स्ट्रिङ प्राप्ति बाहेक, अधिक उन्नत डेटा विश्लेषणमा प्रयोग गर्न सकिन्छ। यहाँ, अनुप्रयोगात्मक प्रयोगको रूपमा फर्म्याट निर्दिष्टरको उपयोगविशिष्ट डेटाको निकासीकम्मा विभाजित डेटाको विश्लेषणविभिन्न डेटा प्रकारको प्रक्रियात्रुटि ह्यान्डलिङ बारे विस्तृत रूपमा व्याख्या गरिन्छ।

4.1 फर्म्याट निर्दिष्टरको उपयोग

sscanf को फर्म्याट निर्दिष्टरलाई राम्रोसँग प्रयोग गर्दा, अधिक लचिलो डेटा विश्लेषण सम्भव हुन्छ। विशेष गरी, तलको जस्तै निर्दिष्टरहरूको संयोजन द्वारा, विभिन्न डेटा प्रकारहरूलाई ह्यान्डल गर्न सकिन्छ।

निर्देशकविवरण
%dपूर्णांक प्राप्त गर्नुहोस्
%fफ्लोटिङ पोइन्ट संख्या प्राप्त गर्नुहोस्
%sस्ट्रिङ प्राप्त गर्नुहोस् (स्पेस द्वारा विभाजन)
%cएकल अक्षर प्राप्त गर्नुहोस्
%[A-Za-z]विशिष्ट अक्षर दायरा को स्ट्रिङ प्राप्त गर्नुहोस्

उदाहरण: स्पेस समावेश गर्ने स्ट्रिङको प्राप्ति

सामान्य %s ले स्पेस द्वारा विभाजित स्ट्रिङ प्राप्त गर्छ, तर %[^ ] प्रयोग गरेर लाइन ब्रेक सम्मको सबै अक्षरहरू प्राप्त गर्न सकिन्छ।

#include <stdio.h>

int main() {
    char str[] = "Hello World!";
    char result[50];

    sscanf(str, "%[^
]", result);
    printf("प्राप्त गरिएको स्ट्रिङ: %sn", result);

    return 0;
}

आउटपुट परिणाम

प्राप्त गरिएको स्ट्रिङ: Hello World!

यसरी %[^ ] प्रयोग गर्दा, स्पेस समावेश गर्ने स्ट्रिङ पनि सही रूपमा प्राप्त गर्न सकिन्छ।

4.2 विशिष्ट डेटा निकाल्ने

sscanf स्ट्रिङभित्रको विशिष्ट डेटा निकाल्न पनि उपयुक्त छ।

उदाहरण: मितिको विश्लेषण

उदाहरणका लागि, “2025-02-01” जस्ता मिति डेटा बाट, वर्ष·महिना·दिनलाई अलग‑अलग प्राप्त गर्न सकिन्छ।

#include <stdio.h>

int main() {
    char date[] = "2025-02-01";
    int year, month, day;

    sscanf(date, "%d-%d-%d", &year, &month, &day);
    printf("वर्ष: %d, महिना: %d, दिन: %dn", year, month, day);

    return 0;
}

आउटपुट परिणाम

4.3 कम्मा विभाजित डेटा विश्लेषण

CSV(Comma-Separated Values)डेटा प्रक्रिया गर्दा, sscanf को उपयोग उपयोगी हुन्छ।

उदाहरण: CSV डेटा विश्लेषण

#include <stdio.h>

int main() {
    char input[] = "Apple,120,2.5";
    char product[20];
    int quantity;
    float price;

    sscanf(input, "%[^,],%d,%f", product, &quantity, &price);
    printf("उत्पादन नाम: %s, मात्रा: %d, मूल्य: %.2fn", product, quantity, price);

    return 0;
}

आउटपुट परिणाम

4.4 विभिन्न डेटा प्रकारको विश्लेषण

संख्या र स्ट्रिङ मिश्रित डेटा लाई sscanf द्वारा प्रक्रिया गर्ने तरिका प्रस्तुत गर्दछ।

उदाहरण: ID·नाम·स्कोरको विश्लेषण

#include <stdio.h>

int main() {
    char input[] = "ID123 Name:Taro Score:95";
    char id[10], name[20];
    int score;

    sscanf(input, "ID%s Name:%s Score:%d", id, name, &score);
    printf("ID: %s, नाम: %s, अंक: %dn", id, name, score);

    return 0;
}

आउटपुट परिणाम

4.5 त्रुटि ह्यान्डलिङ लागू गर्ने

sscanf को रिटर्न मानलाई प्रयोग गरेर, त्रुटि जाँच गर्नु महत्त्वपूर्ण छ।

उदाहरण: इनपुट जाँच गर्ने

#include <stdio.h>

int main() {
    char str[] = "42";
    int num;
    int result = sscanf(str, "%d", &num);

    if (result == 1) {
        printf("प्राप्ति सफल: %dn", num);
    } else {
        printf("प्राप्ति असफलn");
    }

    return 0;
}

आउटपुट परिणाम

सफल प्राप्ति: 42

यसरी, sscanf को रिटर्न मान जाँच गरेर, इनपुट त्रुटि उचित रूपमा प्रक्रिया गर्न सकिन्छ।

4.6 सारांश

  • sscanf को फर्म्याट निर्दिष्टरलाई प्रयोग गर्दा, लचिलो डेटा विश्लेषण सम्भव हुन्छ।
  • विशिष्ट डेटा (मिति‑समय वा कम्मा विभाजित डेटा आदि) निकाल्न सकिन्छ।
  • sscanf को रिटर्न मानलाई प्रयोग गरेर, त्रुटि जाँच गरी सुरक्षित प्रक्रिया गर्न सकिन्छ।

5. sscanf प्रयोग गर्दा ध्यान दिनुपर्ने बुँदा र सुरक्षा जोखिम

sscanf उपयोगी फङ्क्शन हो, तर गलत तरिकाले प्रयोग गर्दा बफर ओभरफ्लो वा अनपेक्षित व्यवहार उत्पन्न हुन सक्छ। विशेष गरी, बाह्य स्रोतबाट प्राप्त डेटा प्रक्रिया गर्दा उपयुक्त त्रुटि ह्यान्डलिङ र मान्यकरण आवश्यक हुन्छ।

यहाँ, sscanf प्रयोग गर्दा ध्यान दिनुपर्ने बुँदा र सुरक्षा जोखिम टार्ने तरिकाहरू व्याख्या गरिन्छ।

5.1 बफर ओभरफ्लोको जोखिम

sscanf प्रयोग गर्दा, उपयुक्त बफर साइजलाई विचार नगरेमा, बफर ओभरफ्लो उत्पन्न हुन सक्छ।

खतरनाक कोड उदाहरण

#include <stdio.h>

int main() {
    char name[10];
    char str[] = "VeryLongUserName";

    sscanf(str, "%s", name);
    printf("नाम: %sn", name);

    return 0;
}

समस्या बिन्दु

  • name को साइज 10 बाइट हो, तर "VeryLongUserName" 16 बाइट हो।
  • बफर ओभरफ्लो उत्पन्न भई, मेमोरी क्षति हुन सक्ने सम्भावना छ।

सुरक्षित कोड उदाहरण

#include <stdio.h>

int main() {
    char name[10];
    char str[] = "VeryLongUserName";

    sscanf(str, "%9s", name);  // 9 अक्षर + अन्तिम '\0' को कारण 9 निर्दिष्ट
    printf("नाम: %sn", name);

    return 0;
}

%9s प्रयोग गरेर, अधिकतम 9 अक्षर मात्र पढिन्छ, र मेमोरी क्षति रोक्न सकिन्छ।

5.2 अनपेक्षित इनपुटको लागि त्रुटि जाँच

sscanf को रिटर्न मान जाँच नगरेमा, गलत डेटा पास भएमा प्रोग्राम असामान्य रूपमा चल्न सक्छ।

समस्या भएको कोड

#include <stdio.h>

int main() {
    char str[] = "abc";
    int num;

    sscanf(str, "%d", &num);  // असफल हुन्छ, त्रुटि जाँच छैन
    printf("प्राप्त गरिएको संख्या: %dn", num);

    return 0;
}

यस अवस्थामा, num को मान अनिश्चित (र्याण्डम) हुन्छ, र अनपेक्षित व्यवहार उत्पन्न हुन सक्छ।

सुरक्षित कोड

#include <stdio.h>

int main() {
    char str[] = "abc";
    int num;

    if (sscanf(str, "%d", &num) == 1) {
        printf("प्राप्त गरिएको संख्या: %dn", num);
    } else {
        printf("त्रुटि: संख्या प्राप्त गर्न सकिएन।n");
    }

    return 0;
}

आउटपुट परिणाम

त्रुटि: संख्या प्राप्त गर्न सकिएन。

यसले गर्दा, गलत इनपुट भए पनि सुरक्षित रूपमा प्रक्रिया जारी राख्न सकिन्छ।

5.3 इनपुट डेटा मान्यकरण

अनपेक्षित डेटा आएमा, प्रोग्रामको कार्य अस्थिर हुन सक्छ। त्यसैले, sscanf प्रयोग गर्नु अघि डेटा को प्रमाणीकरण (भ्यालिडेसन) गर्नु महत्त्वपूर्ण छ।

उदाहरण: प्रयोगकर्ता इनपुटको मान्यकरण

#include <stdio.h>
#include <ctype.h>

int is_number(const char *str) {
    while (*str) {
        if (!isdigit(*str)) return 0;  // अङ्क बाहेक केही समावेश भएमा त्रुटि
        str++;
    }
    return 1;
}

int main() {
    char input[] = "42a";  // अमान्य संख्याको रूपमा
    int num;

    if (is_number(input)) {
        sscanf(input, "%d", &num);
        printf("प्राप्त गरिएको संख्या: %dn", num);
    } else {
        printf("त्रुटि: अवैध संख्या प्रविष्ट गरियो।n");
    }

    return 0;
}

आउटपुट परिणाम

त्रुटि: अवैध संख्या प्रविष्ट गरियो。

यसरी, डेटा संख्यात्मक हो कि छैन पूर्व जाँच गरेर, सुरक्षित प्रक्रिया सम्भव हुन्छ।

5.4 fgets सँग संयोजन गरेर सुरक्षित स्ट्रिंग प्रक्रिया

sscanf को सट्टा fgets प्रयोग गरेर, सुरक्षित रूपमा इनपुट प्रक्रिया गर्ने तरिका पनि छ।

सुरक्षित स्ट्रिंग प्राप्ति

#include <stdio.h>

int main() {
    char buffer[100];

    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    fgets(buffer, sizeof(buffer), stdin);

    printf("प्राप्त स्ट्रिङ: %s", buffer);

    return 0;
}

fgets बफर ओभरफ्लो रोक्दै, प्रयोगकर्ता इनपुट प्राप्त गर्न सक्छ, त्यसैले sscanf सँग संयोजन गर्दा सुरक्षा बढ्छ।

5.5 सारांश

  • बफर ओभरफ्लो रोक्नको लागि, फर्म्याट निर्देशकमा अधिकतम लम्बाइ सेट गर्नुहोस्।
  • फर्किने मान जाँच गरेर, डेटा प्राप्ति सफल भएको पुष्टि गर्नुहोस्।
  • इनपुट डेटालाई अग्रिम भ्यालिडेसन गरेर, अवैध डेटाको प्रक्रिया रोक्नुहोस्।
  • fgets आदि प्रयोग गरेर, सुरक्षित इनपुट प्रक्रिया गर्नुहोस्।

6. सामान्य त्रुटिहरू र तिनीहरूको समाधान

sscanf उपयोगी कार्य हो, तर गलत प्रयोग गर्दा अनपेक्षित व्यवहार उत्पन्न हुन सक्छ। यस खण्डमा, शुरुआतीहरूले सजिलै पर्न सक्ने त्रुटिहरू र तिनीहरूको समाधान लाई विस्तृत रूपमा व्याख्या गर्नेछौं।

6.1 पोइन्टरको गलत प्रयोगले हुने सेग्मेन्टेशन फॉल्ट

गलत कोड

#include <stdio.h>

int main() {
    char *str = "123 456";  // स्ट्रिङ लिटरल परिवर्तन गर्न सकिँदैन
    int a, b;

    sscanf(str, "%d %d", &a, &b);
    printf("a = %d, b = %dn", a, b);

    return 0;
}

यो कोडले sscanf प्रयोग गरेर पूर्णांक प्राप्त गर्छ, तर str स्ट्रिङ लिटरल("123 456" लाई संकेत गर्दछ, जुन परिवर्तन गर्न नसकिने मेमोरी क्षेत्रमा राखिएको हुन्छ।

समाधान: char str[] को रूप प्रयोग गर्नुहोस्।

सुधारिएको कोड

#include <stdio.h>

int main() {
    char str[] = "123 456";  // एरेको रूपमा परिभाषित (परिवर्तनीय)
    int a, b;

    sscanf(str, "%d %d", &a, &b);
    printf("a = %d, b = %dn", a, b);

    return 0;
}

6.2 फर्म्याट स्पेसिफायरको त्रुटि

गलत कोड

#include <stdio.h>

int main() {
    char str[] = "123.45";
    int num;

    sscanf(str, "%d", &num);  // पूर्णांकको रूपमा विश्लेषण गर्ने प्रयास
    printf("प्राप्त गरिएको संख्या: %dn", num);

    return 0;
}

यो कोडले, "123.45" लाई पूर्णांक %d को रूपमा विश्लेषण गर्ने प्रयास गर्छ। दशमलव बिन्दुको प्रभावले, मान सही रूपमा प्राप्त हुँदैन।

समाधान: %f प्रयोग गर्नुहोस्।

सुधारिएको कोड

#include <stdio.h>

int main() {
    char str[] = "123.45";
    float num;

    sscanf(str, "%f", &num);
    printf("प्राप्त गरिएको संख्या: %.2fn", num);

    return 0;
}

आउटपुट

प्राप्त गरिएको संख्या: 123.45

6.3 त्रुटि जाँच नगर्ने

गलत कोड

#include <stdio.h>

int main() {
    char str[] = "abc";
    int num;

    sscanf(str, "%d", &num);  // स्ट्रिङ् "abc" लाई सङ्ख्यामा रूपान्तरण गर्न सकिँदैन
    printf("प्राप्त गरिएको संख्या: %dn", num);

    return 0;
}

"abc" पूर्णांकमा रूपान्तरण गर्न नसक्ने कारण, num को मान फोहोर मान बनिन्छ, जसले अनपेक्षित व्यवहार उत्पन्न गर्छ।

समाधान: sscanf को रिटर्न मान जाँच गर्नुहोस्।

सुधारिएको कोड

#include <stdio.h>

int main() {
    char str[] = "abc";
    int num;

    if (sscanf(str, "%d", &num) == 1) {
        printf("प्राप्त संख्या: %dn", num);
    } else {
        printf("त्रुटि: संख्या प्राप्त गर्न सकिएन。n");
    }

    return 0;
}

आउटपुट

त्रुटि: संख्या प्राप्त गर्न सकिएन।

6.4 स्पेस समावेशी स्ट्रिङ सही रूपमा प्राप्त गर्न नसक्ने

गलत कोड

#include <stdio.h>

int main() {
    char str[] = "Hello World";
    char word1[10], word2[10];

    sscanf(str, "%s %s", word1, word2);
    printf("शब्द1: %s, शब्द2: %sn", word1, word2);

    return 0;
}

%s डिफल्ट रूपमा खाली स्थानलाई विभाजकको रूपमा लिन्छ, जसले Hello World को "World" लाई अर्को भेरिएबलमा राख्छ।

समाधान: %[^ ] प्रयोग गरेर नयाँ लाइनसम्मको स्ट्रिङ प्राप्त गर्नुहोस् गर्नुहोस्।

सुधारिएको कोड

#include <stdio.h>

int main() {
    char str[] = "Hello World";
    char sentence[50];

    sscanf(str, "%[^
]", sentence);
    printf("प्राप्त गरिएको स्ट्रिङ: %sn", sentence);

    return 0;
}

आउटपुट

प्राप्त गरिएको स्ट्रिङ: Hello World

6.5 संख्यात्मक दायरा भन्दा बाहिर जानु

गलत कोड

#include <stdio.h>

int main() {
    char str[] = "999999999999";
    int num;

    sscanf(str, "%d", &num);
    printf("प्राप्त गरिएको संख्या: %dn", num);

    return 0;
}

int प्रकारको अधिकतम मान(सामान्यतया 2147483647)लाई पार गरेमा, ओभरफ्लो हुन्छ र अनपेक्षित व्यवहार उत्पन्न हुन्छ।

समाधान: long long प्रयोग गर्नुहोस्।

सुधारिएको कोड

#include <stdio.h>

int main() {
    char str[] = "999999999999";
    long long num;

    sscanf(str, "%lld", &num);
    printf("प्राप्त गरिएको संख्या: %lldn", num);

    return 0;
}

आउटपुट

प्राप्त गरिएको संख्या: 999999999999

6.6 सारांश

  • पॉइन्टरको गलत प्रयोग बाट बच्न, उपयुक्त मेमोरी सुरक्षित गर्नुहोस्।
  • फर्म्याट स्पेसिफायरको त्रुटि रोक्न, डेटा प्रकार अनुसारको स्पेसिफायर प्रयोग गर्नुहोस्।
  • त्रुटि जाँच अनिवार्य रूपमा गर्नुहोस्, अनपेक्षित व्यवहार रोक्न।
  • स्पेस समावेशी स्ट्रिङ प्राप्त गर्दा %[^ ] प्रयोग गर्नुहोस्।
  • int को दायरा भन्दा बाहिर भएमा long long प्रयोग गर्नुहोस्।
  • NULL पोइन्टर नपठाउने गरी जाँच गर्नुहोस्।

7. FAQ(प्रायः सोधिने प्रश्न)

sscanf प्रयोग गर्दा, विकासकर्ताहरूले प्रायः सामना गर्ने प्रश्नहरूलाई विस्तृत रूपमा व्याख्या गर्छौं। आधारभूत प्रयोगबाट उन्नत प्रयोगसम्म, विशिष्ट उदाहरणहरू सहित उत्तर प्रदान गर्छौं।

7.1 sscanf र scanf को भिन्नता के हो?

scanfsscanf दुवै डेटा लाई फर्म्याट स्पेसिफायर अनुसार प्राप्त गर्ने फङ्क्सन हुन्, तर इनपुट स्रोत फरक हुन्छ।

विषयsscanfscanf
इनपुट स्रोतस्ट्रिङ (char[])मानक इनपुट (stdin)
उपयोगअवस्थित स्ट्रिङ विश्लेषणप्रयोगकर्ता इनपुट प्राप्त
लचिलोपनउच्च (डेटा रूपान्तरण सजिलो)निम्न (रियल‑टाइम इनपुट)
त्रुटि ह्यान्डलिङसजिलोगाह्रो

उदाहरण: scanf को प्रयोग

#include <stdio.h>

int main() {
    int num;
    printf("संख्या प्रविष्ट गर्नुहोस्: ");
    scanf("%d", &num);
    printf("प्रविष्ट गरिएको संख्या: %dn", num);
    return 0;
}

मानक इनपुट (किबोर्ड) बाट मान प्राप्त गर्ने।

उदाहरण: sscanf को प्रयोग

#include <stdio.h>

int main() {
    char str[] = "123";
    int num;
    sscanf(str, "%d", &num);
    printf("विश्लेषित संख्या: %dn", num);
    return 0;
}

अवस्थित स्ट्रिङ "123" लाई संख्यामा रूपान्तरण गर्ने।

7.2 sscanf द्वारा स्पेस समावेशी स्ट्रिङ प्राप्त गर्न कसरी?

डिफल्टको %s ले स्पेसलाई विभाजकको रूपमा मान्छ। स्पेस समावेशी स्ट्रिङ प्राप्त गर्न %[^ ] प्रयोग गर्नुहोस्।

उदाहरण: स्पेस समावेशी स्ट्रिङको प्राप्ति

#include <stdio.h>

int main() {
    char str[] = "Hello World!";
    char result[50];

    sscanf(str, "%[^
]", result);
    printf("प्राप्त गरिएको स्ट्रिङ: %sn", result);
    return 0;
}

आउटपुट

प्राप्त गरिएको स्ट्रिङ: Hello World!

7.3 sscanf को रिटर्न मानको अर्थ के हो?

sscanf को रिटर्न मानले, सफलतापूर्वक प्राप्त भएको डेटा संख्या फर्काउँछ। डेटा प्राप्त गर्न असफल भएमा 0 वा EOF(-1) फर्काउँछ।

उदाहरण: रिटर्न मान जाँच गर्ने

#include <stdio.h>

int main() {
    char str[] = "42";
    int num;
    int result = sscanf(str, "%d", &num);

    if (result == 1) {
        printf("प्राप्ति सफल: %dn", num);
    } else {
        printf("प्राप्ति असफलn");
    }

    return 0;
}

आउटपुट

प्राप्ति सफल: 42

7.4 sscanf द्वारा संख्यात्मक र स्ट्रिङलाई एकै साथ प्राप्त गर्न कसरी?

sscanf प्रयोग गर्दा, संख्यात्मक र स्ट्रिङलाई एकै साथ विश्लेषण गर्न सकिन्छ।

उदाहरण: ID, नाम, स्कोरको विश्लेषण

#include <stdio.h>

int main() {
    char input[] = "ID123 Name:Taro Score:95";
    char id[10], name[20];
    int score;

    sscanf(input, "ID%s Name:%s Score:%d", id, name, &score);
    printf("ID: %s, नाम: %s, अंक: %dn", id, name, score);
    return 0;
}

आउटपुट

ID: 123, नाम: Taro, स्कोर: 95

7.5 sscanf को त्रुटि ह्यान्डलिङ कसरी गर्ने?

त्रुटि जाँच नगरेमा, अनपेक्षित डेटा प्रवेश हुन सक्छ। sscanf को रिटर्न मान प्रयोग गरेर जाँच गरौं।

उदाहरण: इनपुट जाँच

#include <stdio.h>

int main() {
    char str[] = "abc";  // अंकको रूपमा अवैध स्ट्रिङ
    int num;

    if (sscanf(str, "%d", &num) == 1) {
        printf("प्राप्त गरिएको संख्या: %dn", num);
    } else {
        printf("त्रुटि: संख्या प्राप्त गर्न सकिएन।n");
    }

    return 0;
}

आउटपुट

त्रुटि: संख्या प्राप्त गर्न सकिएन।

7.6 sscanf को सट्टामा strtok प्रयोग गर्नु उपयुक्त?

केही अवस्थामा strtok अधिक उपयुक्त हुन सक्छ।

उपयोगsscanfstrtok
स्ट्रिङ विश्लेषणफर्म्याट स्पेसिफायर प्रयोगविभाजक क्यारेक्टर निर्दिष्ट
प्राप्ति विधिफर्म्याट अनुसार मान प्राप्तस्ट्रिङलाई टोकनमा विभाजन
लचिलोपनउच्च (इन्टिजर, स्ट्रिङ, दशमलव आदि प्राप्त गर्न सकिने)लगातार टोकन प्रोसेसिङमा उपयुक्त

उदाहरण: strtok प्रयोग गरेर स्ट्रिङको विभाजन

#include <stdio.h>
#include <string.h>

int main() {
    char input[] = "apple,banana,orange";
    char *token = strtok(input, ",");

    while (token != NULL) {
        printf("फल: %sn", token);
        token = strtok(NULL, ",");
    }
    return 0;
}

आउटपुट

फल: apple
फल: banana
फल: orange

7.7 सारांश

  • scanfsscanf को भिन्नताsscanf स्ट्रिङ विश्लेषणको लागि उपयुक्त
  • स्पेस समावेशी स्ट्रिङको प्राप्ति%[^ ] प्रयोग गर्नुहोस्
  • त्रुटि जाँचsscanf को रिटर्न मान जाँच
  • संख्या र स्ट्रिङको एकै साथ प्राप्ति → फर्म्याट उपयुक्त रूपमा निर्दिष्ट
  • वैकल्पिक उपायstrtok प्रयोग गर्ने स्थिती पहिचान गर्नु
  • सुरक्षित प्रयोगबफर साइज निर्दिष्ट・त्रुटि जाँच・fgets को संयोजन

8. सारांश

यस लेखमा, C भाषा को sscanf कार्यको बारेमा, आधारभूत प्रयोगबाट उन्नत, ध्यान दिनुपर्ने बुँदा, सामान्य त्रुटिहरू र तिनीहरूको समाधान, FAQ सम्म विस्तृत रूपमा व्याख्या गरिएको छ। अन्तमा, महत्वपूर्ण बुँदा लाई संक्षेपमा प्रस्तुत गरी, sscanf लाई सुरक्षित र प्रभावकारी रूपमा प्रयोग गर्ने सर्वोत्तम अभ्यासहरू प्रस्तुत गरिन्छ।

8.1 यस लेखको समग्र सारांश

sscanf को आधारभूत

  • sscanf भनेको स्ट्रिङबाट डेटा विश्लेषण गर्ने कार्य हो।
  • scanf भन्दा फरक, मानक इनपुटको सट्टा स्ट्रिङलाई प्रक्रिया गर्ने विशेषता छ।
  • आधारभूत वाक्यरचना:
  int sscanf(const char *str, const char *format, ...);
  • फरम्याट स्पेसिफायर प्रयोग गरेर, पूर्णांक, फ्लोटिङ पोइन्ट संख्या, स्ट्रिङ आदि प्राप्त गर्न सकिन्छ।

sscanf को प्रयोग

  • संख्यात्मक मान प्राप्ति
  sscanf("123", "%d", &num);
  • बहु डेटा प्राप्ति
  sscanf("100 200", "%d %d", &a, &b);
  • संख्यात्मक मान र स्ट्रिङलाई एकै साथ प्राप्ति
  sscanf("ID123 Name:Taro Score:95", "ID%s Name:%s Score:%d", id, name, &score);
  • स्पेस समावेशी स्ट्रिङ प्राप्ति

8.2 sscanf प्रयोग गर्दा ध्यान दिनुपर्ने बुँदा

गलत प्रयोगसमस्या बुँदासमाधान
%s को लागि लम्बाइ निर्दिष्ट नगर्नेबफर ओभरफ्लो को जोखिम%9s जस्तै लम्बाइ निर्दिष्ट गर्ने
त्रुटि जाँच नगर्नेअनपेक्षित डेटा प्रक्रिया गर्ने सम्भावनाsscanf को रिटर्न मानलाई अनिवार्य रूपमा जाँच गर्नु
NULL पॉइन्टर पास गर्नेसेग्मेन्टेशन फॉल्टपॉइन्टरले NULL नभएको कुरा सुनिश्चित गर्नु
%d द्वारा 999999999999 प्राप्त गर्नुइन्टिजर ओभरफ्लोlong long प्रकार प्रयोग गरी %lld निर्दिष्ट गर्नु

8.3 sscanf को सर्वोत्तम अभ्यास

✅ 1. बफर साइज निर्दिष्ट गर्नु

char name[10];
sscanf(str, "%9s", name);  // अधिकतम 9 अक्षरसम्म प्राप्त गर्नुहोस् (+ '\0')

बफर ओभरफ्लो रोक्नु!

✅ 2. त्रुटि जाँच गर्नु

if (sscanf(str, "%d", &num) != 1) {
    printf("त्रुटि: सङ्ख्या प्राप्त गर्न सकिएन।n");
}

डेटा प्राप्ति सफल भयो कि भएन जाँच गर्नु!

✅ 3. fgets सँगै प्रयोग गर्नु

char buffer[100];
fgets(buffer, sizeof(buffer), stdin);

प्रयोगकर्ता इनपुटको सुरक्षा सुनिश्चित गर्नु!

✅ 4. स्ट्रिङ विश्लेषण गर्दा strtoksscanf लाई अलग-अलग प्रयोग गर्नु

char *token = strtok(str, ",");
while (token != NULL) {
    printf("%sn", token);
    token = strtok(NULL, ",");
}

sscanf ले फार्म्याट निर्दिष्ट गर्दछ, strtok टोकन विभाजनमा प्रयोग हुन्छ!

8.4 यस लेखलाई उपयोग गर्नका लागि

📌 वास्तविक रूपमा कोड लेखी परीक्षण गर्नु
📌 फरम्याट स्पेसिफायरका विविधताहरू सिक्नु
📌 सुरक्षित कोड लेख्ने चेतना राख्नु

8.5 सारांश

🔹 sscanf स्ट्रिङबाट डेटा विश्लेषण गर्न उपयोगी कार्य हो
🔹 आधारभूत प्रयोग देखि उन्नत प्रविधि सम्म व्यापक रूपमा प्रयोग गर्न सकिन्छ
🔹 ध्यान दिनुपर्ने बुँदाहरू बुझेर, उपयुक्त त्रुटि ह्यान्डलिंग गर्नु महत्वपूर्ण छ
🔹 बफर साइज निर्दिष्ट गर्नु र fgets सँगै प्रयोग गरेर सुरक्षा बढाउन

sscanf लाई सही रूपमा प्रयोग गरी, सुरक्षित C भाषा प्रोग्रामिङ अभ्यास गरौं!

9. सन्दर्भ