C भाषा इनपुट प्रोसेसिंग गाइड | उन्नतसम्म सुरक्षित कोड

目次

1. परिचय: C भाषा मा इनपुट के हो?

C भाषा प्रोग्रामिङ भाषाहरू मध्ये व्यापक रूपमा प्रयोग गरिन्छ र प्रणाली विकास तथा एम्बेडेड प्रणालीहरूमा महत्वपूर्ण भूमिका खेल्छ।
त्यसैमा, “इनपुट प्रक्रिया” प्रयोगकर्ताबाट डेटा प्राप्त गरी प्रोग्राममा प्रतिबिम्बित गर्न आवश्यक कार्य हो।
यस लेखमा, C भाषामा इनपुट प्रक्रियाको आधारभूतदेखि उन्नतसम्म विस्तृत रूपमा व्याख्या गरिनेछ, जसले शुरुआतीदेखि मध्यवर्ती स्तरका प्रयोगकर्ताहरूलाई उपयोगी ज्ञान प्रदान गर्दछ।

C भाषामा इनपुटको भूमिका

C भाषामा इनपुट मुख्यतया तलका उद्देश्यहरूका लागि प्रयोग गरिन्छ।

  1. प्रयोगकर्ताको डेटा इनपुट: कन्सोलबाट प्रयोगकर्ताले संख्याहरू वा स्ट्रिङहरू इनपुट गर्छ।
  2. फाइल पढ्ने: बाह्य फाइलबाट डेटा प्राप्त गरी प्रक्रिया गरिन्छ।
  3. डेटा प्रमाणीकरण र रूपान्तरण: इनपुट डेटा जाँच गरी, आवश्यक परेमा सुधार वा रूपान्तरण गरिन्छ।

उदाहरणका लागि, प्रयोगकर्ताले इनपुट गरेको संख्याको आधारमा गणना गर्ने प्रोग्राम वा फाइलबाट ग्राहक जानकारी पढ्ने प्रणाली यसमा पर्छ।

इनपुट प्रक्रियाको महत्व

इनपुट प्रक्रिया प्रोग्रामको सुरक्षा र विश्वसनीयतासँग प्रत्यक्ष सम्बन्धित छ। विशेष गरी तलका बुँदाहरूमा ध्यान दिनु आवश्यक छ।

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

लेखको उद्देश्य र सामग्री

यस लेखमा, C भाषामा इनपुट प्रक्रियाको आधारभूत र उन्नतलाई तलका चरणहरूमा व्याख्या गरिनेछ।

  1. मानक इनपुट र मानक आउटपुटको मेकानिज्म
  2. आधारभूत इनपुट फंक्शनको प्रयोग र सुरक्षा प्रति विचार
  3. उन्नत इनपुट प्रक्रिया र फाइल अपरेसन
  4. त्रुटि ह्यान्डलिंग र मल्टिबाइट क्यारेक्टरको समर्थन

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

अर्को चरण

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

2. मूलभूत इनपुट प्रक्रिया र कार्यहरूको प्रयोग

C भाषा मा, इनपुट प्रक्रिया गर्नका लागि मानक पुस्तकालयका कार्यहरू उपलब्ध गराइएका छन्। यस खण्डमा, मानक इनपुट र मानक आउटपुटको मेकानिज्मलाई व्याख्या गरी, विशिष्ट कार्यहरूको प्रयोगलाई स्पष्ट गरिन्छ।

2.1 मानक इनपुट र मानक आउटपुटको मेकानिज्म

C भाषामा “मानक इनपुट” भनेको किबोर्ड आदि बाट डेटा प्राप्त गर्ने मेकानिज्म हो। त्यस्तै गरी, “मानक आउटपुट” भनेको स्क्रिनमा नतिजा देखाउने मेकानिज्मलाई जनाउँछ।

मानक इनपुट (stdin) र मानक आउटपुट (stdout) को सारांश

  • मानक इनपुट (stdin):किबोर्डबाट प्रयोगकर्ताले इनपुट गर्ने डेटा प्राप्त गर्न प्रयोग गरिन्छ।
  • मानक आउटपुट (stdout):प्राप्त डेटा वा प्रक्रिया नतिजा स्क्रिनमा देखाउन प्रयोग गरिन्छ।

यीहरू मानक पुस्तकालय मा परिभाषित छन्, र प्रोग्राम भित्र स्वतन्त्र रूपमा प्रयोग गर्न सकिन्छ।

मूलभूत प्रोग्राम उदाहरण

तलको प्रोग्रामले मानक इनपुटबाट एक पूर्णांक लिन्छ र मानक आउटपुटमा त्यसको मान देखाउँछ।

#include <stdio.h>

int main() {
    int number;

    printf("कृपया पूर्णांक प्रविष्ट गर्नुहोस्: ");
    scanf("%d", &number); // मानक इनपुटबाट पूर्णांक पढ्नुहोस्
    printf("प्रविष्ट गरिएको मान %d हो。\n", number); // मानक आउटपुटमा परिणाम प्रदर्शन गर्नुहोस्

    return 0;
}

यस प्रोग्राममा, प्रयोगकर्ताले किबोर्डबाट इनपुट गरेको संख्या चरnumber मा संग्रहित हुन्छ र स्क्रिनमा आउटपुट हुन्छ।

2.2 scanf कार्यद्वारा इनपुट प्रक्रिया

scanf कार्यको मूल संरचना

scanf("फार्मेट निर्दिष्टक", पता);

फरम्याट स्पेसिफायर ले इनपुट हुने डेटाको प्रकार निर्दिष्ट गर्छ। मुख्य स्पेसिफायरहरू तलका अनुसार छन्।

स्पेसिफायरडेटा प्रकारविवरण
%dintपूर्णांक
%ffloatफ्लोटिङ पोइन्ट संख्या
%lfdoubleडबल प्रिसिजन फ्लोटिङ पोइन्ट संख्या
%cchar१ अक्षर
%schar एरेस्ट्रिङ

व्यावहारिक उदाहरण: बहु डेटा इनपुट

#include <stdio.h>

int main() {
    int age;
    float height;

    printf("उमेर र कदलाई स्पेसले छुट्याएर इनपुट गर्नुहोस्: ");
    scanf("%d %f", &age, &height); // पूर्णांक र फ्लोटिङ प्वाइन्ट संख्या इनपुट गर्नुहोस्
    printf("उमेर: %d, कद: %.2f
", age, height);

    return 0;
}

यस प्रोग्रामले उमेर र उचाइलाई एकै साथ इनपुट गरी, प्रत्येक चरमा संग्रहित गरी देखाउँछ।

ध्यान दिनु पर्ने बुँदा: बफर ओभरफ्लो

scanf कार्यमा, अनपेक्षित इनपुट आकारले बफर ओभरफ्लो उत्पन्न हुन सजिलो हुन्छ। विशेष गरी स्ट्रिङ इनपुटमा, सीमा नलगाएमा मेमोरी नष्ट हुने जोखिम हुन्छ।

2.3 स्ट्रिङ इनपुट र सुरक्षित प्रक्रिया

gets कार्य असिफारिस गरिएको

परम्परागत C भाषामा स्ट्रिङ इनपुटका लागि gets कार्य प्रयोग गरिन्थ्यो, तर बफर ओभरफ्लो रोक्ने मेकानिज्म नभएको कारण, सुरक्षा समस्याका कारण यसको प्रयोग सिफारिस गरिएको छैन।

सुरक्षित वैकल्पिक कार्य: fgets

वर्तमानमा, fgets कार्यलाई सुरक्षित स्ट्रिङ इनपुटको रूपमा सिफारिस गरिएको छ।

#include <stdio.h>

int main() {
    char name[50];

    printf("नाम प्रविष्ट गर्नुहोस्: ");
    fgets(name, sizeof(name), stdin); // सुरक्षित रूपमा स्ट्रिङ इनपुट गर्नुहोस्
    printf("प्रविष्ट गरिएको नाम: %s", name);

    return 0;
}

बिन्दुfgets मा, इनपुट आकार सीमित गर्न सकिन्छ, जसले बफर ओभरफ्लोको जोखिमलाई रोक्न सक्छ।

स्ट्रिङको लाइनब्रेक हटाउने

fgets ले लाइनब्रेक क्येश गर्दछ, त्यसलाई हटाउने प्रक्रिया थप्न आवश्यक छ।

name[strcspn(name, "
")] = ' '; // नयाँ पंक्ति वर्ण हटाउनुहोस्

2.4 इनपुट त्रुटि प्रक्रिया

गलत इनपुटको पहिचान

प्रयोगकर्ताले अपेक्षित ढाँचासँग फरक डेटा इनपुट गरेमा, scanf ले त्रुटि पत्ता लगाउन सक्छ।

#include <stdio.h>

int main() {
    int number;

    printf("कृपया पूर्णांक प्रविष्ट गर्नुहोस्: ");
    if (scanf("%d", &number) != 1) { // एकैपटकको इनपुट सफलतापूर्वक प्राप्त भएको छ कि जाँच गर्नुहोस्
        printf("अमान्य इनपुट छ।\n");
        return 1; // त्रुटि समाप्ति
    }

    printf("प्रविष्ट गरिएको मान: %d\n", number);
    return 0;
}

यस कोडमा, पूर्णांक इनपुट नभएमा त्रुटि सन्देश देखाएर प्रोग्राम समाप्त गरिन्छ।

年収訴求

3. उन्नत इनपुट प्रोसेसिंगको व्याख्या

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

3.1 फाइलबाट इनपुट प्रोसेसिंग

C भाषामा, मानक इनपुट मात्र होइन, फाइलबाट डेटा इनपुट पनि महत्वपूर्ण प्रोसेस मध्ये एक हो। प्रोग्रामले बाह्य डेटा प्रयोग गर्दा उपयोगी हुन्छ।

फाइलको खोल्ने र बन्द गर्ने

फाइललाई ह्यान्डल गर्न, पहिले fopen फङ्क्शनले फाइल खोलिन्छ, र fclose फङ्क्शनले बन्द गरिन्छ।

#include <stdio.h>

int main() {
    FILE *file; // फाइल पोइन्टर घोषणा
    file = fopen("data.txt", "r"); // फाइललाई पढ्ने मात्र मोडमा खोल्नुहोस्

    if (file == NULL) { // त्रुटि जाँच
        printf("फाइल खोल्न सकिएन।\n");
        return 1;
    }

    printf("फाइल सफलतापूर्वक खुल्यो।\n");

    fclose(file); // फाइल बन्द गर्नुहोस्
    return 0;
}

यो कोडमा, फाइल अवस्थित नभएमा एरर मेसेज देखाइन्छ, र प्रोग्राम समाप्त गरिन्छ।

fscanf फङ्क्शनद्वारा फाइल इनपुट

फङ्क्शन प्रयोग गर्दा, फाइलबाट ढाँचामा अनुरूप डेटा पढ्न सकिन्छ।

#include <stdio.h>

int main() {
    FILE *file;
    int id;
    char name[50];

    file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("फाइल खोल्न सकिएन。\n");
        return 1;
    }

    while (fscanf(file, "%d %s", &id, name) != EOF) { // EOF सम्म दोहोर्याउनुहोस्
        printf("ID: %d, नाम: %s\n", id, name);
    }

    fclose(file);
    return 0;
}

यो उदाहरणमा, data.txt बाट संख्यात्मक मान र स्ट्रिङ क्रमशः पढिन्छ।

3.2 इनपुट डेटाको प्रमाणीकरण र एरर ह्यान्डलिङ

प्रोग्राममा इनपुट गरिने डेटा सधैं सही हुन्छ भन्ने ग्यारेन्टी छैन, गलत डेटा समावेश हुन सक्छ। त्यसैले, एरर ह्यान्डलिङ सुरक्षित प्रोग्राम निर्माणको लागि अनिवार्य छ।

अवैध डेटा पत्ता लगाउने

तलको कोडले, पूर्णांक बाहेकको इनपुट भएमा एरर पत्ता लगाउँछ।

#include <stdio.h>

int main() {
    int number;
    printf("कृपया पूर्णांक प्रविष्ट गर्नुहोस्: ");

    while (scanf("%d", &number) != 1) { // सही ढंगले स्वरूप नभएमा
        printf("अमान्य इनपुट। पुनः प्रयास गर्नुहोस्: ");
        while (getchar() != '
'); // इनपुट बफर साफ गर्नुहोस्
    }

    printf("प्रविष्ट गरिएको पूर्णांक %d हो।\n", number);
    return 0;
}

यो उदाहरणमा, अवैध इनपुट पत्ता लागेमा पुनः इनपुट माग्ने प्रणाली लागू गरिएको छ।

3.3 संख्यात्मक रूपान्तरण र ढाँचा निर्दिष्टिकरण

प्रोग्राममा, स्ट्रिङबाट संख्यामा रूपान्तरण आवश्यक पर्ने धेरै स्थितिहरू छन्। C भाषामा, strtol वा strtod जस्ता फङ्क्शन प्रयोग गरेर लचिलो रूपमा प्रक्रिया गर्न सकिन्छ।

स्ट्रिङबाट पूर्णांकमा रूपान्तरण (strtol)

#include <stdio.h>
#include <stdlib.h>

int main() {
    char input[20];
    char *endptr; // त्रुटि पत्ता लगाउने सूचक
    long value;

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

    value = strtol(input, &endptr, 10); // 10-आधारमा रूपान्तरण

    if (*endptr != ' ' && *endptr != '\n') { // रूपान्तरण त्रुटि जाँच
        printf("अवैध संख्या हो。\n");
    } else {
        printf("प्रविष्ट गरिएको मान %ld हो。\n", value);
    }

    return 0;
}

यो कोडले, स्ट्रिङबाट पूर्णांकमा रूपान्तरण गर्छ, र गलत डेटा समावेश भएमा एरर मेसेज देखाउँछ।

फ्लोटिङ पोइन्ट संख्यामा रूपान्तरण (strtod)

#include <stdio.h>
#include <stdlib.h>

int main() {
    char input[20];
    char *endptr;
    double value;

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

    value = strtod(input, &endptr); // दशमलव बिन्दुमा रूपान्तरण

    if (*endptr != ' ' && *endptr != '
') {
        printf("अवैध संख्या हो。
");
    } else {
        printf("प्रविष्ट गरिएको मान %.2f हो。
", value);
    }

    return 0;
}

यो उदाहरणमा, दशमलव बिन्दु सहितको संख्याहरू पनि ठीकसँग प्रक्रिया गर्न सकिन्छ।

4. जापानी र मल्टिबाइट क्यारेक्टरको इनपुट प्रक्रिया

यस खण्डमा, जापानी सहित मल्टिबाइट क्यारेक्टरको इनपुट प्रक्रिया बारे व्याख्या गरिन्छ। जापानी जस्ता गैर-ASCII क्यारेक्टरहरूलाई सही रूपमा ह्यान्डल गर्न, अक्षर कोडको बुझाइ र उपयुक्त कार्यहरूको प्रयोग महत्त्वपूर्ण छ।

4.1 जापानीलाई ह्यान्डल गर्नको तयारी

अक्षर कोड र एन्कोडिङको भिन्नता

जापानीलाई ह्यान्डल गर्दा, अक्षर कोड र एन्कोडिङलाई उपयुक्त रूपमा सेट गर्न आवश्यक छ। मुख्यतया तलका ३ प्रकार प्रयोग गरिन्छ।

अक्षर कोडविशेषता
UTF-8विश्व मानकको अक्षर कोड। धेरै प्रणाली र प्लेटफर्महरूमा उपलब्ध।
Shift_JISजापान भित्र धेरै प्रयोग भएको अक्षर कोड। पुरानो वातावरणमा उच्च अनुकूलता।
EUC-JPUNIX प्रणालीहरूमा धेरै प्रयोग भएको अक्षर कोड।

प्रोग्रामलाई अन्तर्राष्ट्रिय बनाउँदा, UTF-8 को प्रयोग सिफारिस गरिन्छ।

लोक्याल सेटिङ

जापानीलाई सही रूपमा ह्यान्डल गर्न, लोक्याल (क्षेत्रीय सेटिङ) निर्दिष्ट गर्न आवश्यक छ। तलको कोडमा, लोक्याललाई जापानीमा सेट गरिएको छ।

#include <stdio.h>
#include <locale.h>

int main() {
    setlocale(LC_ALL, "ja_JP.UTF-8"); // जापानी भाषा सेटिङ्ग

    printf("लोकेल सेट गरिएको छ。
");
    return 0;
}

यो सेटिङले जापानी स्ट्रिङ र अक्षर कोडलाई सजिलै ह्यान्डल गर्न बनाउँछ।

4.2 वाइड क्यारेक्टर र wchar_t को उपयोग

C भाषामा, जापानी जस्ता मल्टिबाइट क्यारेक्टरहरूलाई ह्यान्डल गर्न वाइड क्यारेक्टर प्रकार प्रदान गरिएको छ। वाइड क्यारेक्टरले wchar_t प्रकार प्रयोग गर्छ, सामान्य char प्रकारभन्दा धेरै डेटा भण्डारण गर्न सक्छ।

वाइड क्यारेक्टरको इनपुट र आउटपुट

तल वाइड क्यारेक्टर प्रयोग गरेर इनपुट र आउटपुटको उदाहरण छ।

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
    wchar_t name[50]; // वाइड क्यारेक्टर टाइपको एरे
    setlocale(LC_ALL, "ja_JP.UTF-8"); // जापानी समर्थन गर्ने लोकेल सेटिङ

    wprintf(L"नाम प्रविष्ट गर्नुहोस्: ");
    fgetws(name, sizeof(name) / sizeof(wchar_t), stdin); // वाइड क्यारेक्टर इनपुट
    wprintf(L"प्रविष्ट गरिएको नाम हो: %ls\n", name); // वाइड क्यारेक्टर आउटपुट

    return 0;
}

कोडका बुँदाहरू

  1. setlocale कार्यको प्रयोग: जापानी इनपुटलाई सही रूपमा प्रोसेस गर्न लोक्याल सेट गरिएको छ।
  2. wchar_t प्रकारको प्रयोग: वाइड क्यारेक्टर भण्डारण गर्न प्रयोग गरिन्छ।
  3. wprintffgetws: वाइड क्यारेक्टरका लागि विशेष इनपुट/आउटपुट कार्यहरू प्रयोग गरेर, जापानी र अन्य मल्टिबाइट क्यारेक्टरहरूलाई सुरक्षित रूपमा प्रोसेस गर्न सकिन्छ।

4.3 मल्टिबाइट क्यारेक्टरको प्रोसेसिंग

मल्टिबाइट क्यारेक्टर र बाइट संख्याको गणना

मल्टिबाइट क्यारेक्टरहरूले प्रत्येक क्यारेक्टरमा धेरै बाइट प्रयोग गर्न सक्छन्। त्यसैले, सही क्यारेक्टर संख्या वा बाइट संख्या गणना गर्न विशेष कार्यहरू प्रयोग गरिन्छ।

तल मल्टिबाइट स्ट्रिङको लम्बाइ गणना गर्ने उदाहरण छ।

#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main() {
    setlocale(LC_ALL, "ja_JP.UTF-8");

    char str[] = "नमस्ते"; // मल्टिबाइट स्ट्रिङ
    int length = mbstowcs(NULL, str, 0); // अक्षर संख्या गणना

    printf("अक्षर संख्या: %d\n", length);
    return 0;
}

यस उदाहरणमा, mbstowcs कार्य प्रयोग गरेर मल्टिबाइट स्ट्रिङको लम्बाइ गणना गरिएको छ।

4.4 मल्टिबाइट क्यारेक्टरको त्रुटि ह्यान्डलिंग

अवैध अक्षर कोडको पत्ता लगाउने

प्रोग्रामभित्र मल्टिबाइट क्यारेक्टर प्रोसेस गर्दा, यदि अवैध अक्षर कोड समावेश छ भने त्रुटि पत्ता लगाउन आवश्यक हुन्छ।

#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <wchar.h>

int main() {
    setlocale(LC_ALL, "ja_JP.UTF-8");

    char input[100];
    wchar_t output[100];
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    fgets(input, sizeof(input), stdin); // इनपुट प्राप्त गर्नुहोस्

    if (mbstowcs(output, input, 100) == (size_t)-1) { // त्रुटि जाँच
        printf("अवैध क्यारेक्टर कोड पत्ता लागेको छ。
");
        return 1;
    }

    wprintf(L"परिवर्तन परिणाम: %ls
", output);
    return 0;
}

यस प्रोग्राममा, mbstowcs कार्य प्रयोग गरेर त्रुटि जाँच गरिन्छ, र अमान्य अक्षर कोड पत्ता लगाइन्छ।

5. व्यावहारिक उदाहरण: समग्र इनपुट प्रोग्रामको निर्माण

यस खण्डमा, अहिलेसम्म सिकेको ज्ञानलाई प्रयोग गरी, व्यावहारिक इनपुट प्रोग्राम बनाउनेछौं। विशिष्ट रूपमा, पूर्णांक, फ्लोटिङ पोइन्ट संख्या, स्ट्रिङको इनपुट र प्रमाणीकरण, फाइल अपरेसन, जापानी समर्थनको इनपुट प्रोसेसिङलाई संयोजन गर्ने कोड उदाहरण प्रस्तुत गर्दछौं।

5.1 उदाहरण 1: बहु डेटा इनपुट र प्रमाणीकरण

पहिले, पूर्णांक, फ्लोटिङ पोइन्ट संख्या, स्ट्रिङलाई संयोजन गर्ने इनपुट प्रोग्राम बनाउनेछौं। यस प्रोग्राममा, इनपुट डेटाको प्रमाणीकरण पनि गरिनेछ।

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

int main() {
    int age;
    float height;
    char name[50];

    // नाम इनपुट
    printf("कृपया नाम प्रविष्ट गर्नुहोस्: ");
    fgets(name, sizeof(name), stdin);
    name[strcspn(name, "\n")] = ' '; // नयाँ पंक्ति हटाउनुहोस्

    // उमेर इनपुट र प्रमाणीकरण
    printf("कृपया उमेर प्रविष्ट गर्नुहोस्: ");
    while (scanf("%d", &age) != 1 || age < 0) {
        printf("अमान्य इनपुट। पुनः प्रयास गर्नुहोस्: ");
        while (getchar() != '\n'); // इनपुट बफर साफ गर्नुहोस्
    }

    // कद इनपुट र प्रमाणीकरण
    printf("कृपया कद (सेमी) प्रविष्ट गर्नुहोस्: ");
    while (scanf("%f", &height) != 1 || height < 0) {
        printf("अमान्य इनपुट। पुनः प्रयास गर्नुहोस्: ");
        while (getchar() != '\n'); // इनपुट बफर साफ गर्नुहोस्
    }

    // परिणाम आउटपुट
    printf("नाम: %s\n", name);
    printf("उमेर: %d वर्ष\n", age);
    printf("कद: %.2f सेमी\n", height);

    return 0;
}

कोडका बुँदाहरू

  1. नामको इनपुट र लाइनब्रेक हटाउने: fgets प्रयोग गरेर सुरक्षित रूपमा स्ट्रिङ प्राप्त गरी, लाइनब्रेक हटाइरहेका छौं।
  2. पूर्णांक र फ्लोटिङ पोइन्ट संख्याको प्रमाणीकरण: इनपुट त्रुटि हुँदा पुनः इनपुट गर्न प्रेरित गर्ने लूप प्रोसेस प्रयोग गरिन्छ।
  3. इनपुट बफरको सफा: त्रुटि प्रोसेस पछि अनावश्यक डेटा सफा गरेर, प्रोग्रामको गलत कार्यलाई रोक्छ।

5.2 उदाहरण 2: फाइलबाट डेटा पढ्ने प्रोग्राम

अर्को, फाइल इनपुटलाई प्रयोग गरेर बहु डेटा प्रोसेस गर्ने प्रोग्राम प्रस्तुत गर्दछौं।

#include <stdio.h>
#include <stdlib.h>

int main() {
    FILE *file;
    int id;
    char name[50];
    float score;

    // फाइल खोल्नुहोस्
    file = fopen("data.txt", "r");
    if (file == NULL) {
        printf("फाइल खोल्न सकिएन。
");
        return 1;
    }

    printf("डेटा सूची:
");

    // फाइलबाट डेटा पढ्नुहोस्
    while (fscanf(file, "%d %s %f", &id, name, &score) == 3) {
        printf("ID: %d, नाम: %s, अंक: %.2f
", id, name, score);
    }

    fclose(file); // फाइल बन्द गर्नुहोस्
    return 0;
}

कोडका बुँदाहरू

  1. फाइलको खोल्ने र बन्द गर्ने: fopen र fclose प्रयोग गरेर फाइल अपरेसन सुरक्षित रूपमा गरिन्छ।
  2. fscanf द्वारा डेटा प्राप्ति: बहु डेटा प्रकार निर्दिष्ट गरेर इनपुट प्राप्त गरिन्छ।
  3. EOF सम्मको लूप प्रोसेस: फाइलको अन्त्यसम्म डेटा पढिन्छ।

5.3 उदाहरण 3: जापानी समर्थनको प्रोग्राम

अन्तमा, जापानी इनपुटलाई समर्थन गर्ने प्रोग्राम बनाउनेछौं। यस उदाहरणमा, मल्टिबाइट क्यारेक्टर प्रयोग गरेर नाम इनपुट गरी, फाइलमा आउटपुट गरिन्छ।

#include <stdio.h>
#include <wchar.h>
#include <locale.h>

int main() {
    FILE *file;
    wchar_t name[50]; // चौडाइ अक्षर प्रकारको ऐरे

    // लोकेल सेटिङ
    setlocale(LC_ALL, "ja_JP.UTF-8");

    // नाम इनपुट
    wprintf(L"नाम प्रविष्ट गर्नुहोस्: ");
    fgetws(name, sizeof(name) / sizeof(wchar_t), stdin);

    // लाइन ब्रेक वर्ण हटाउनुहोस्
    name[wcslen(name) - 1] = L' ';

    // फाइलमा सुरक्षित गर्नुहोस्
    file = fopen("output.txt", "w");
    if (file == NULL) {
        wprintf(L"फाइल खोल्न सकेन।\n");
        return 1;
    }

    fwprintf(file, L"नाम: %ls\n", name); // जापानी फाइलमा आउटपुट
    fclose(file);

    wprintf(L"डेटा सुरक्षित गरियो।\n");
    return 0;
}

कोडका बुँदाहरू

  1. लोक्याल सेटिङ: जापानी क्यारेक्टर कोडलाई उचित रूपमा प्रोसेस गर्नको लागि सेटिङ हो।
  2. वाइड क्यारेक्टर समर्थनको इनपुट/आउटपुट फङ्क्सन: fgetwsfwprintf प्रयोग गरेर, जापानीको सुरक्षित प्रोसेसिङ प्राप्त हुन्छ।
  3. लाइनब्रेक हटाउने: वाइड क्यारेक्टरमा पनि लाइनब्रेक हटाउने प्रोसेस थपिएको छ।

6. सामान्य त्रुटिहरू र ट्रबलशूटिङ

यस खण्डमा, C भाषा मा इनपुट प्रोसेसिङ गर्दा प्रायः उत्पन्न हुने त्रुटिहरू र समस्याहरू प्रस्तुत गरिन्छ, र तिनीहरूका लागि विशिष्ट समाधानहरू व्याख्या गरिन्छ।

6.1 बफर ओभरफ्लो

समस्याको सारांश

scanf जस्ता फंक्शन प्रयोग गर्दा, इनपुट आकारले अपेक्षा भन्दा बढी भएमा बफर ओभरफ्लो उत्पन्न हुन सक्छ, जसले प्रोग्रामलाई अनपेक्षित व्यवहार गराउन सक्छ।

उदाहरण

#include <stdio.h>

int main() {
    char buffer[10];
    printf("नाम प्रविष्ट गर्नुहोस्: ");
    scanf("%s", buffer); // बफर आकार भन्दा बढी डेटा इनपुट
    printf("नाम: %s
", buffer);
    return 0;
}

यो कोडमा, 10 अक्षर भन्दा बढी इनपुट प्राप्त गर्दा बफर ओभरफ्लो हुन्छ र मेमोरी क्षतिग्रस्त हुन सक्छ।

समाधान:fgets को प्रयोग

सुरक्षित विकल्पको रूपमा fgets फंक्शन प्रयोग गरी इनपुट आकारलाई सीमित गरिन्छ।

#include <stdio.h>

int main() {
    char buffer[10];
    printf("कृपया नाम प्रविष्ट गर्नुहोस्: ");
    fgets(buffer, sizeof(buffer), stdin); // आकार सीमित गरेर सुरक्षित रूपमा प्राप्त गर्नुहोस्
    printf("नाम: %s
", buffer);
    return 0;
}

यो कोडले बफर आकारलाई सीमित गरी ओभरफ्लो रोक्छ।

6.2 इनपुट बफरको बाँकी डेटा

समस्याको सारांश

scanf फंक्शनमा, नयाँ लाइन क्यारेक्टर वा स्पेस बफरमा बाँकी रहन सक्छ, जसले अर्को इनपुट प्रोसेसिङमा अनपेक्षित व्यवहार उत्पन्न गर्न सक्छ।

उदाहरण

#include <stdio.h>

int main() {
    int age;
    char name[50];

    printf("उमेर प्रविष्ट गर्नुहोस्: ");
    scanf("%d", &age); // लाइन ब्रेक क्यारेक्टर बफरमा बाँकी रहन्छ
    printf("नाम प्रविष्ट गर्नुहोस्: ");
    fgets(name, sizeof(name), stdin); // बाँकी रहेको लाइन ब्रेक क्यारेक्टरलाई त्यस्तै पढ्नुहोस्
    printf("नाम: %s
", name);
}

यो कोडमा, उमेर इनपुट पछि नयाँ लाइन क्यारेक्टरले नाम इनपुटलाई असर गरी, नाम इनपुट स्किप हुने समस्या उत्पन्न हुन्छ।

समाधान: बफर क्लियर गर्ने कार्यान्वयन

#include <stdio.h>

int main() {
    int age;
    char name[50];

    printf("कृपया उमेर प्रविष्ट गर्नुहोस्: ");
    scanf("%d", &age);
    while (getchar() != '\n'); // बफर साफ गर्नुहोस्

    printf("कृपया नाम प्रविष्ट गर्नुहोस्: ");
    fgets(name, sizeof(name), stdin); // सुरक्षित रूपमा स्ट्रिङ प्राप्त गर्नुहोस्
    printf("नाम: %s\n", name);

    return 0;
}

यो कोडमा, getchar प्रयोग गरी अतिरिक्त क्यारेक्टरहरू क्लियर गरिन्छ, जसले अर्को इनपुट प्रोसेसिङ सही रूपमा चल्न सुनिश्चित गर्छ।

6.3 संख्यात्मक रूपान्तरण त्रुटि

समस्याको सारांश

स्ट्रिङलाई संख्यामा रूपान्तरण गर्दा, यदि अवैध क्यारेक्टरहरू समावेश छन् भने त्रुटि उत्पन्न हुन्छ।

उदाहरण

#include <stdio.h>
#include <stdlib.h>

int main() {
    char input[10];
    int number;

    printf("कृपया संख्या प्रविष्ट गर्नुहोस्: ");
    fgets(input, sizeof(input), stdin);
    number = atoi(input); // अवैध स्ट्रिङ भएपनि 0 फर्किन्छ
    printf("प्रविष्ट गरिएको संख्या: %d\n", number);
}

यो कोडमा, अवैध स्ट्रिङ इनपुट गर्दा पनि त्रुटि नआइ 0 फिर्ता हुन्छ, जसले त्रुटि ह्यान्डलिङ अपूर्ण बनाउँछ।

समाधान:strtol फंक्शनद्वारा त्रुटि जाँच

#include <stdio.h>
#include <stdlib.h>

int main() {
    char input[10];
    char *endptr;
    long number;

    printf("कृपया संख्या प्रविष्ट गर्नुहोस्: ");
    fgets(input, sizeof(input), stdin);
    number = strtol(input, &endptr, 10); // संख्या परिवर्तन

    if (*endptr != ' ' && *endptr != '
') { // परिवर्तन त्रुटि जाँच
        printf("अमान्य संख्या हो。
");
    } else {
        printf("प्रविष्ट मान %ld हो。
", number);
    }

    return 0;
}

यो कोडले, स्ट्रिङमा अवैध भाग भएमा त्रुटि सन्देश देखाएर सुरक्षित रूपमा प्रोसेस गर्छ।

6.4 जापानी अक्षर बिग्रिनु

समस्याको सारांश

जापानी प्रयोग गर्दा क्यारेक्टर कोड सही रूपमा सेट नभएमा अक्षर बिग्रिनु हुन्छ।

उदाहरण

#include <stdio.h>

int main() {
    char name[50];
    printf("नाम प्रविष्टि गर्नुहोस्: ");
    fgets(name, sizeof(name), stdin);
    printf("नाम: %s
", name);
}

यो कोड UTF-8 वातावरणमा चलाउँदा सही देखिन्छ, तर Shift_JIS वातावरणमा अक्षर बिग्रिनु सम्भव छ।

समाधान: लोकेल सेटिङ र वाइड क्यारेक्टरको प्रयोग

#include <stdio.h>
#include <locale.h>
#include <wchar.h>

int main() {
    wchar_t name[50];
    setlocale(LC_ALL, "ja_JP.UTF-8");

    wprintf(L"कृपया आफ्नो नाम प्रविष्ट गर्नुहोस्: ");
    fgetws(name, sizeof(name) / sizeof(wchar_t), stdin);
    wprintf(L"नाम: %ls
", name);

    return 0;
}

यो कोडले, लोकेल सेटिङ र वाइड क्यारेक्टरलाई संयोजन गरी अक्षर बिग्रिनु रोक्छ।

7. सारांश र आगामी चरणहरू

अहिलेसम्मका लेखहरूमा, C भाषा सम्बन्धी इनपुट प्रोसेसिंग को आधारभूतदेखि उन्नत, एरर ह्यान्डलिंग, जापानी भाषा समर्थन, र ट्रबलशुटिङसम्म व्यापक रूपमा व्याख्या गरेका छौं। यस सेक्सनमा, लेखको सामग्रीलाई छोटकरीमा पुनरावलोकन गरी, अर्को सिक्नुपर्ने चरणहरू प्रस्ताव गर्छौं।

7.1 लेखका मुख्य बुँदाहरूको पुनरावलोकन

1. आधारभूत इनपुट प्रोसेसिंग

  • स्ट्यान्डर्ड इनपुट र स्ट्यान्डर्ड आउटपुटको मेकानिज्म बुझेर, scanffgets प्रयोग गरेर डेटा प्राप्त गर्ने तरिका सिक्यौं।
  • एरर ह्यान्डलिंग र बफर ओभरफ्लो रोकथाम मार्फत, सुरक्षित कोड लेख्नको आधारभूत ज्ञान हासिल गर्यौं।

2. उन्नत इनपुट प्रोसेसिंग

  • फाइलबाट डेटा पढ्ने विधि र ढाँचामा आधारित डेटा प्रमाणीकरण प्रविधिहरू प्रस्तुत गर्यौं।
  • संख्यात्मक रूपान्तरण र एरर ह्यान्डलिंगलाई संयोजन गरेर, लचिलो र विश्वसनीय प्रोग्रामको कार्यान्वयन तरिका बुझ्यौं।

3. जापानी भाषा र मल्टिबाइट क्यारेक्टरको इनपुट प्रोसेसिंग

  • लोक्याल सेटिङ र वाइड क्यारेक्टर प्रयोग गरेर, जापानी भाषा र बहुभाषी समर्थन गर्ने प्रोग्रामको आधारभूत कुरा सिक्यौं।
  • मल्टिबाइट क्यारेक्टरको प्रोसेसिंग र एरर पत्ता लगाउने महत्त्व पुष्टि गर्यौं।

4. व्यावहारिक नमुना प्रोग्रामहरू

  • वास्तविक प्रोग्राम उदाहरणहरू मार्फत, पूर्णांक, फ्लोटिङ पोइन्ट नम्बर, स्ट्रिङ, फाइल प्रोसेसिंग, जापानी भाषा समर्थन आदि संयोजन गरेर समग्र कोड बनाउने तरिका प्रस्तुत गर्यौं।

5. सामान्य त्रुटिहरू र ट्रबलशुटिङ

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

7.2 भविष्यको अध्ययन चरणहरू

C भाषाको इनपुट प्रोसेसिंगको बुझाइलाई गहिरो बनाइसकेपछि, आगामी चरणको रूपमा तलका बिषयहरू सिक्न सिफारिस गर्छौं।

  1. एरे र पोइन्टरको प्रयोग
  • इनपुट प्रोसेसिंगमा एरे र पोइन्टर बारम्बार प्रयोग गरिन्छ। मेमोरी व्यवस्थापन र डायनामिक एरेको प्रयोग सिकेर, अझ उन्नत प्रोग्रामहरू बनाउन सक्षम बनौं।
  1. स्ट्रक्चर र फाइल प्रोसेसिंगको उन्नत प्रयोग
  • स्ट्रक्चर प्रयोग गरेर जटिल डेटा व्यवस्थापन गरी, फाइलमा लेख्ने र पढ्ने प्रक्रिया बलियो बनाउँछौं।
  1. फङ्क्शन र मोड्युलराइजेशन
  • प्रोग्रामलाई फङ्क्शन स्तरमा व्यवस्थित गरी, मोड्युलराइजेशनलाई अगाडि बढाएर, पुन: प्रयोगयोग्यता र पढ्न सजिलो बनाउँछौं।
  1. एरर ह्यान्डलिंग र एक्सेप्शन प्रोसेसिंग
  • अझ उन्नत एरर ह्यान्डलिंग र लग फिचरहरू थपेर, बलियो प्रोग्राम बनाउँछौं।
  1. मल्टिथ्रेड प्रोग्रामिङ
  • इनपुट प्रोसेसिंगलाई बहु थ्रेडमा एकै समयमा प्रक्रिया गर्ने प्रविधि सिकेर, छिटो र प्रभावकारी एप्लिकेशनहरू बनाउन सकिन्छ।
  1. अन्य भाषा संग एकीकरण र नेटवर्क प्रोग्रामिङ
  • C भाषा प्रयोग गरेर नेटवर्क प्रोग्रामिङ र Python, JavaScript जस्ता अन्य भाषासँगको एकीकरणलाई पनि विचार गरी, व्यावहारिक एप्लिकेशनहरू निर्माण गर्छौं।

7.3 पाठकहरूलाई सल्लाह

1. कोडलाई वास्तविक रूपमा चलाएर हेर्नु

  • सिद्धान्त मात्र होइन, प्रस्तुत नमुना कोड आफैँ लेखी, चलाएर यसको कार्यप्रणाली जाँच गरौं। एररको अनुभवले बुझाइलाई गहिरो बनाउँछ।

2. रेफरेन्सलाई सक्रिय रूपमा प्रयोग गर्नु

  • स्ट्यान्डर्ड लाइब्रेरी र C भाषाको रेफरेन्सलाई उपयोग गरी, अस्पष्ट बुँदा भए तुरुन्तै खोज्ने बानी बनाऔं।

3. साना प्रोग्रामबाट ठूला प्रोग्रामसम्म

  • सानो स्तरको प्रोग्रामबाट सुरु गरी, क्रमिक रूपमा जटिल प्रोग्रामहरू बनाउँदै, चरणबद्ध रूपमा सीपलाई उन्नत बनाउँछौं।

4. एरर मेसेजलाई डराउनु नहोस्

  • एररहरू प्रोग्रामलाई विकास गर्ने संकेत हुन्। एरर मेसेजलाई विश्लेषण गरी, समस्या समाधान गर्ने क्षमता विकास गरौं।

7.4 निष्कर्षमा

यस लेखमा, C भाषाको इनपुट प्रोसेसिंगलाई केन्द्रित गरी व्याख्या गरी, सुरक्षित र व्यावहारिक प्रोग्राम बनाउनको लागि आधारभूत र लागू प्रविधिहरू सिक्यौं।

C भाषा सरल तर शक्तिशाली भाषा हो, र यसको बुझाइलाई गहिरो बनाउँदा धेरै अनुप्रयोग प्रोग्रामहरू बनाउन सकिन्छ।

आगामीमा, यस लेखमा प्रस्तुत सामग्रीलाई आधार बनाएर अझ व्यावहारिक प्रोग्राम निर्माणमा चुनौती दिऔं, र C भाषाको सम्भावनाहरूलाई विस्तार गरौं।

年収訴求