C भाषा परिचय: स्ट्रिङ इनपुटको मूलभूतदेखि उन्नतसम्म | सुरक्षित कोड उदाहरण सहित

目次

1. परिचय

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

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

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

2. C भाषा को स्ट्रिङ इनपुट के हो? मूल अवधारणा को व्याख्या

स्ट्रिङ के हो?

C भाषामा स्ट्रिङहरू अक्षरको एरेको रूपमा व्यक्त गरिन्छ। स्ट्रिङको अन्त्यमा अनिवार्य रूपमा 「\0」 नामको टर्मिनेटर चिन्ह जोडिन्छ, जसले स्ट्रिङको समाप्ति जनाउँछ। यो विशेषताले C भाषा स्ट्रिङको लम्बाइ स्पष्ट रूपमा निर्दिष्ट नगरी पनि प्रयोग गर्न सम्भव बनाउँछ।

स्ट्रिङ र एरेको सम्बन्ध

C भाषामा, स्ट्रिङ वास्तवमा अक्षर प्रकार(char型)の तत्व हो। उदाहरणका लागि, तलको जस्तै स्ट्रिङ घोषणा गर्न सकिन्छ।

char str[10];  // 10 अक्षरको स्ट्रिङको लागि बफर तयार गर्नुहोस्

यस उदाहरणमा, अधिकतम 10 अक्षरको स्ट्रिङ भण्डारण गर्न मेमोरी क्षेत्र सुरक्षित गरिन्छ। तर, 1 अक्षर टर्मिनेटर चिन्ह「\0」को लागि प्रयोग हुने भएकाले, वास्तविकमा भण्डारण गर्न सकिने अक्षर संख्या 9 अक्षर हो।

स्ट्रिङ लिटरलको उदाहरण

स्ट्रिङ लिटरल भनेको डबल कोट(”)मा घेरिएको स्ट्रिङ हो। तलको उदाहरण स्ट्रिङ लिटरल प्रयोग गरेर बनाइएको हो।

char greeting[] = "Hello";

यस अवस्थामा, greeting स्वचालित रूपमा साइज 6(”Hello”+टर्मिनेटर चिन्ह\0)को एरेको रूपमा ह्यान्डल गरिन्छ।

स्ट्रिङ इनपुट आवश्यक हुने कारण

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

3. स्ट्रिङ इनपुटको आधारभूत कार्यहरू र प्रयोग उदाहरण

3-1. scanf कार्य

scanf कार्यको आधारभूत प्रयोग

scanf कार्य मानक इनपुट(किबोर्ड)बाट डेटा प्राप्त गर्न प्रयोग गरिन्छ। स्ट्रिङ इनपुट गर्दा, %s नामक स्वरूप निर्दिष्टकर्ता प्रयोग गरिन्छ।

कोड उदाहरण:

#include 
int main() {
    char str[50];  // अधिकतम ५० अक्षरको स्ट्रिङ भण्डारण गर्ने बफर
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    scanf("%s", str);  // मानक इनपुटबाट स्ट्रिङ प्राप्त गर्नुहोस्
    printf("प्रविष्ट गरिएको स्ट्रिङ: %s\n", str);
    return 0;
}

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

scanf कार्यको ध्यान दिनुपर्ने बुँदा

  1. खाली स्थान वर्णहरूको प्रक्रिया गर्न सकिँदैन:
    scanfफङ्सनले स्पेस, ट्याब, लाइन ब्रेक जस्ता खाली अक्षरहरूलाई विभाजन चिन्हको रूपमा मान्छ। त्यसैले, खाली अक्षरहरू समावेश गर्ने स्ट्रिङहरू बीचमा टुट्छन्।

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

Hello World

आउटपुट:

Hello
  1. बफर ओभरफ्लोको जोखिम:
    प्रविष्ट गरिएको स्ट्रिङ बफर साइजलाई पार गरेमा、मेमोरी क्षेत्र नष्ट हुन सक्छ।यसले प्रोग्राम क्र्यास हुन वा भेद्यता शोषणको जोखिम निम्त्याउँछ。

उपाय:
अधिक सुरक्षित कार्यहरू(पछिल्लो भागमा उल्लेखितfgets जस्ता) प्रयोग गर्न सिफारिस गरिन्छ।

3-2. fgets कार्य

fgets कार्यको आधारभूत प्रयोग

fgets कार्य निर्दिष्ट गरिएको अक्षर संख्यासम्म सुरक्षित रूपमा स्ट्रिङ इनपुट गर्न सक्ने कार्य हो। यसले नयाँ लाइन अक्षर पनि समावेश गर्दछ, त्यसैले बफर ओभरफ्लोको चिन्ता हुँदैन।

कोड उदाहरण:

#include 
int main() {
    char str[50];  // अधिकतम ५० अक्षरको बफर
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    fgets(str, sizeof(str), stdin);  // सुरक्षित रूपमा स्ट्रिङ प्रविष्ट गर्नुहोस्
    printf("प्रविष्ट गरिएको स्ट्रिङ: %s", str);
    return 0;
}

यो कार्यक्रमले अधिकतम ५० अक्षरसम्मको स्ट्रिङ इनपुट गरी सुरक्षित रूपमा आउटपुट गर्न सक्छ।

fgets कार्यका फाइदाहरू

  1. बफर ओभरफ्लो रोक्नुहोस्:
    बफर आकार निर्दिष्ट गरेर, ओभरफ्लो रोक्न सकिन्छ।
  2. खाली स्थान समावेश गर्ने स्ट्रिङको प्रक्रिया सम्भव छ:
    प्रविष्ट गरिएको स्ट्रिङमा स्पेस र ट्याब पनि समावेश हुन्छन्।

fgets कार्यको ध्यान दिनुपर्ने बुँदा

  1. नयाँ पङ्क्ति वर्णको प्रक्रिया:
    प्रविष्ट गरिएको स्ट्रिङको अन्त्यमा नयाँ पङ्क्ति वर्ण समावेश भएको कारण, आउटपुट गर्दा अतिरिक्त नयाँ पङ्क्ति उत्पन्न हुन सक्छ।

नयाँ लाइन हटाउने उदाहरण:

str[strcspn(str, "
")] = ' ';
  1. मानक इनपुट बफरमा बाँकी रहेको डेटा को प्रक्रिया:
    fgetsउपयोग गरेपछि अर्को इनपुट प्रक्रिया गर्दा, बफरमा अतिरिक्त डेटा बाँकी रहन सक्छ। यसलाई रोक्नको लागिfflush(stdin)getchar()उपयोग गर्ने सम्भावना छ।

3-3. कुन प्रयोग गर्ने?

function nameUsagePoints to note
scanfSimple string input (short strings without spaces)Be careful with handling whitespace and buffer overflow.
fgetsBest for input containing whitespaceYou may need to handle newline characters and clear buffers.

शुरु गर्नेहरू र व्यावहारिक कार्यक्रमहरूमा, सुरक्षा प्राथमिकता दिँदै fgets प्रयोग गर्न सिफारिस गरिन्छ।

4. सुरक्षित स्ट्रिङ इनपुटको लागि व्यावहारिक प्रविधिहरू

4-1. बफर ओभरफ्लो उपाय

बफर ओभरफ्लो के हो?

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

उदाहरण:
तलको कोड खतरनाक प्रयोगको उदाहरण हो।

char str[10];
scanf("%s", str);  // इनपुट आकार सीमित गरिएको छैन

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

उपाय 1: fgets प्रयोग गर्नुहोस्

fgetsफलनले बफर आकार निर्दिष्ट गरेर इनपुट सीमित गर्न सकिन्छ, जसले सुरक्षा बढाउँछ।

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

#include 
#include 
int main() {
    char str[10];
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "
")] = ' ';  // नयाँ पङ्क्ति वर्ण हटाउनुहोस्
    printf("प्रविष्ट गरिएको स्ट्रिङ: %s
", str);
    return 0;
}

यो कोडमा, इनपुट आकार 10 अक्षरभित्र सीमित गरिएको छ, र नयाँ पङ्क्ति वर्ण पनि उचित रूपमा ह्यान्डल गरिएको छ।

उपाय 2: इनपुट लम्बाइको जाँच

प्रयोगकर्ताबाटको इनपुट अपेक्षा भन्दा लामो भएमा चेतावनी देखाउने जस्ता उपायहरू लागू गरिन्छ।

उदाहरण:

#include 
#include 
int main() {
    char str[10];
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस् (अधिकतम 9 अक्षर): ");
    fgets(str, sizeof(str), stdin);
    if (strlen(str) >= sizeof(str) - 1 && str[strlen(str) - 1] != '
') {
        printf("इनपुट धेरै लामो छ。\n");
        return 1;  // त्रुटि समाप्ति
    }
    str[strcspn(str, "
")] = ' ';  // नयाँ पंक्ति वर्ण हटाउनुहोस्
    printf("प्रविष्ट गरिएको स्ट्रिङ: %s\n", str);
    return 0;
}

यस उदाहरणमा, इनपुटको लम्बाइ जाँचिन्छ, र धेरै लामो भएमा त्रुटि सन्देश देखाएर प्रक्रिया समाप्त गरिन्छ।

4-2. त्रुटि ह्यान्डलिङको कार्यान्वयन

त्रुटि ह्यान्डलिङको महत्व

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

उपाय 1: पुनः प्रयास प्रक्रिया

प्रयोगकर्ताले अमान्य इनपुट गरेमा पुनः इनपुट गर्न प्रेरित गरिन्छ।

उदाहरण:

#include 
#include 
int main() {
    char str[10];
    int valid = 0;
    while (!valid) {
        printf("कृपया स्ट्रिङ् प्रविष्ट गर्नुहोस् (अधिकतम 9 अक्षर): ");
        fgets(str, sizeof(str), stdin);
        // इनपुट लम्बाइ जाँच
        if (strlen(str) >= sizeof(str) - 1 && str[strlen(str) - 1] != '
') {
            printf("इनपुट धेरै लामो छ। कृपया पुनः प्रविष्ट गर्नुहोस्।
");
            while (getchar() != '
');  // बाँकी इनपुट साफ गर्नुहोस्
        } else {
            str[strcspn(str, "
")] = ' ';  // नयाँ पंक्ति वर्ण हटाउनुहोस्
            valid = 1;  // इनपुट वैध
        }
    }
    printf("प्रविष्ट गरिएको स्ट्रिङ्: %s
", str);
    return 0;
}

यो कार्यक्रममा, इनपुट त्रुटि भएमा पुनः इनपुट गर्न प्रेरित गर्ने रीट्राइ प्रक्रिया लागू गरिएको छ।

उपाय 2: इनपुट फिल्टरिङ

इनपुट स्ट्रिङमा विशेष शर्तहरू (जस्तै केवल अल्फान्यूमेरिक, निश्चित लम्बाइ आदि) लागू गरेर, अवैध डेटा रोक्न सकिन्छ।

उदाहरण:

#include 
#include 
#include 
int isValidInput(const char *str) {
    for (int i = 0; str[i] != ' '; i++) {
        if (!isalnum(str[i])) {  // केवल अल्फान्यूमेरिक अनुमति
            return 0;
        }
    }
    return 1;
}
int main() {
    char str[50];
    printf("कृपया अल्फान्यूमेरिक मात्र प्रविष्ट गर्नुहोस्: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "
")] = ' ';
    if (isValidInput(str)) {
        printf("प्रविष्ट गरिएको स्ट्रिङ: %s\n", str);
    } else {
        printf("अमान्य इनपुट हो。\n");
    }
    return 0;
}

यो कार्यक्रमले केवल अल्फान्यूमेरिकलाई अनुमति दिएको छ।

5. असिफारिस गरिएका कार्यहरू र तिनीहरूको विकल्प

5-1. gets कार्यको जोखिम

gets कार्य भनेको के हो?

gets कार्य प्रयोगकर्ता बाट स्ट्रिङ इनपुट गर्न प्रयोग हुने कार्य हो। यसको मूल प्रयोग तल देखाइएको छ।

कोड उदाहरण:

char str[50];
gets(str);  // मानक इनपुटबाट स्ट्रिङ प्राप्त गर्नुहोस्

यो कोड एक नजरमा सरल र प्रयोग गर्न सजिलो जस्तो देखिन्छ, तर यसमा घातक समस्या छन्।

gets कार्यको समस्या बिन्दुहरू

  1. बफर ओभरफ्लोको जोखिम:
    getsफङ्सनमा、इनपुट डेटा को लम्बाइ सीमित गर्ने सुविधा छैन। त्यसैले、इनपुट बफर साइज भन्दा बढी भएमा मेमोरी नष्ट हुन्छ、र सुरक्षा सम्बन्धी ठूलो जोखिम निम्त्याउँछ।

उदाहरण:

char str[10];
gets(str);  // इनपुट आकारको सीमा छैन

यदि यो कोडमा 20 अक्षर इनपुट गरियो भने, मेमोरी क्षेत्र नष्ट हुन्छ र प्रोग्राम क्र्यास हुन सक्छ।

  1. सुरक्षा जोखिम:
    बफर ओभरफ्लोको दुरुपयोग गरेर गरिएको आक्रमण (उदाहरण: बफर ओभरफ्लो आक्रमण) हुने सम्भावना छ。यसले प्रणालीलाई कब्जा गर्ने जस्ता गम्भीर समस्याहरू उत्पन्न हुन सक्छ。
  2. मानक विनिर्देशमा समाप्ति:
    C99 मानकमा यो अस्वीकृत भयो, र C11 मानकमा हटाइएको छ। अहिले, अधिकांश कम्पाइलरहरूले चेतावनी वा त्रुटि देखाउँछन्।

5-2. सुरक्षित विकल्प कार्यहरू

fgets कार्यको प्रयोग

gets कार्यको सट्टा, fgets कार्य प्रयोग गरेर बफर ओभरफ्लो रोक्न सकिन्छ।

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

#include 
#include 
int main() {
    char str[50];
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    fgets(str, sizeof(str), stdin);  // सुरक्षित रूपमा इनपुट
    str[strcspn(str, "\n")] = ' ';  // नयाँ पङ्क्ति वर्ण हटाउनुहोस्
    printf("प्रविष्ट गरिएको स्ट्रिङ: %s\n", str);
    return 0;
}

scanf कार्यसँग तुलना

scanf कार्य पनि स्ट्रिङ इनपुटका लागि प्रयोग गर्न सकिन्छ, तर माथि उल्लेखित जस्तै खाली स्थान ह्यान्डल गर्न नसक्ने समस्या छ। त्यसैले, जटिल स्ट्रिङ वा सुरक्षा प्राथमिकता भएमा fgets कार्य सिफारिस गरिन्छ।

getline कार्यको प्रयोग

C11 मानक होइन, POSIX मापदण्ड अनुरूप वातावरणमा प्रयोग गर्न सकिने getline कार्य पनि सुरक्षित विकल्प हो।getline गतिशील रूपमा मेमोरी सुरक्षित गर्ने भएकाले बफर साइजको चिन्ता आवश्यक छैन।

उदाहरण:

#include 
#include 
int main() {
    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    read = getline(&line, &len, stdin);  // गतिशील रूपमा मेमोरी सुरक्षित गरेर इनपुट प्राप्त गर्नुहोस्
    if (read != -1) {
        printf("प्रविष्ट गरिएको स्ट्रिङ: %s", line);
    }
    free(line);  // सुरक्षित गरिएको मेमोरी मुक्त गर्नुहोस्
    return 0;
}

असिफारिस गरिएका कार्यहरू टाल्ने महत्त्व

C भाषामा, अतीतका कार्यहरू अहिले सुरक्षा कारणले असिफारिस गरिएका हुन्छन्। विशेष गरी, बाह्य इनपुटसँग काम गर्दा सुरक्षा जोखिम बढ्ने कारण, सुरक्षित विकल्प कार्यहरूमा परिवर्तन अनिवार्य हुन्छ।

Deprecated functionAlternative FunctionMain uses and benefits
getsfgetsSupport for safe fixed-size string input.
getsgetlineSupports dynamic memory allocation and is suitable for large string input.
scanf("%s")fgetsIt can safely handle strings that include whitespace.

 

6. व्यावहारिक उदाहरणहरू र अनुप्रयोग भाग|बहु-पङ्क्तिको स्ट्रिङ इनपुट र प्रक्रिया

6-1. बहु-पङ्क्तिको स्ट्रिङ इनपुट प्राप्त गर्ने

बहु-पङ्क्ति इनपुटको सारांश

प्रोग्राममा, प्रयोगकर्ताबाट बहु-पङ्क्तिको स्ट्रिङ इनपुट गरिन्छ र त्यसलाई एकैचोटि प्रक्रिया गर्ने केसहरू हुन्छन्। उदाहरणका लागि, मेमो एप्लिकेशन जस्तै अनुप्रयोगहरूमा बहु-पङ्क्ति इनपुट अनिवार्य हुन्छ।

उदाहरण 1: 3 पङ्क्तिको इनपुट प्राप्त गर्ने प्रोग्राम

#include 
#include 
#define MAX_LINES 3     // प्रविष्ट गर्ने पङ्क्तिहरूको संख्या
#define MAX_LENGTH 100  // प्रत्येक पङ्क्तिको अधिकतम वर्ण संख्या
int main() {
    char lines[MAX_LINES][MAX_LENGTH];  // स्ट्रिङहरू भण्डारण गर्ने द्विमितीय ऐरे
    printf("%d पङ्क्तिको स्ट्रिङ प्रविष्ट गर्नुहोस्:\n", MAX_LINES);
    for (int i = 0; i < MAX_LINES; i++) {
        printf("%d पङ्क्ति: ", i + 1);
        fgets(lines[i], sizeof(lines[i]), stdin);
        lines[i][strcspn(lines[i], "\n")] = ' ';  // नयाँ पङ्क्ति वर्ण हटाउनुहोस्
    }
    printf("\nप्रविष्ट गरिएका स्ट्रिङहरू:\n");
    for (int i = 0; i < MAX_LINES; i++) {
        printf("%d पङ्क्ति: %s\n", i + 1, lines[i]);
    }
    return 0;
}

बुँदा व्याख्या:

  1. 2-आयामी ऐरे प्रयोग गर्नुहोस्: प्रत्येक पंक्तिलाई अलग एरेमा भण्डारण गरिन्छ।
  2. fgets प्रयोग गरेर सुरक्षित इनपुट: अधिकतम अक्षर संख्या सीमित गर्नुहोस्, र पङ्क्ति परिवर्तन वर्ण हटाउनुहोस्।
  3. Processing with for loop:

कार्यक्रम उदाहरण:

3 पंक्तिको स्ट्रिङ्गहरू प्रविष्ट गर्नुहोस्:
1 पंक्ति: Hello
2 पंक्ति: World
3 पंक्ति: C Language
प्रविष्ट गरिएको स्ट्रिङ्गहरू:
1 पंक्ति: Hello
2 पंक्ति: World
3 पंक्ति: C Language

6-2. खाली स्थान र विशेष वर्ण समावेश गर्ने स्ट्रिङको प्रक्रिया

खाली स्थान वर्ण समावेश गर्ने इनपुट उदाहरण

खाली स्थान समावेश गर्ने स्ट्रिङलाई सुरक्षित रूपमा प्रक्रिया गर्नको लागि fgets प्रयोग गरिन्छ।

उदाहरण 2: स्पेस समावेश गर्ने इनपुटलाई प्रक्रिया गर्ने प्रोग्राम

#include 
#include 
int main() {
    char str[100];  // अधिकतम 100 अक्षरको बफर तयार गर्नुहोस्
    printf("कृपया वाक्य प्रविष्ट गर्नुहोस्: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "
")] = ' ';  // नया पङ्क्ति वर्ण हटाउनुहोस्
    printf("प्रविष्ट गरिएको वाक्य: %s
", str);
    return 0;
}

बुँदा:

  • Strings that include spaces and tabs can also be safely entered.
  • By deleting line break characters, you can prevent unintended line breaks.

कार्यक्रम उदाहरण:

कृपया लेख प्रविष्ट गर्नुहोस्: Hello World with spaces
प्रविष्ट गरिएको लेख: Hello World with spaces

6-3. विशेष वर्ण र एस्केप सिक्वेन्सको प्रक्रिया

विशेष वर्णको इनपुट उदाहरण

C भाषामा, जस्तै एस्केप सिक्वेन्स र प्रतीकहरू समावेश गर्ने इनपुट पनि प्रक्रिया गर्न आवश्यक हुन्छ।

उदाहरण 3: विशेष वर्ण पत्ता लगाउने प्रोग्राम

#include 
#include 
#include 
int main() {
    char str[100];
    int specialCharCount = 0;
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = ' ';  // नयापङ्क्ति वर्ण हटाउनुहोस्
    for (int i = 0; str[i] != ' '; i++) {
        if (!isalnum(str[i]) && !isspace(str[i])) {  // अङ्क, अक्षर र खाली स्थान बाहेकको पत्ता लगाउनुहोस्
            specialCharCount++;
        }
    }
    printf("विशेष वर्णको संख्या: %d\n", specialCharCount);
    return 0;
}

बुँदा:

  • isalnum
  • isspace
  • Count other characters as “special characters”.

कार्यक्रम उदाहरण:

स्ट्रिङ्ग प्रविष्ट गर्नुहोस्: Hello, World! 123
विशेष वर्णको संख्या: 2

6-4. अनुप्रयोग उदाहरण: सरल Memo-chou प्रोग्राम

अन्तमा, बहु-पङ्क्ति इनपुट र फाइल आउटपुटलाई संयोजन गर्ने सरल Memo-chou प्रोग्राम प्रस्तुत गरिन्छ।

उदाहरण 4: Memo-chou प्रोग्राम

#include 
#include 
#define MAX_LINES 5
#define MAX_LENGTH 100
int main() {
    char lines[MAX_LINES][MAX_LENGTH];
    printf("%d पंक्ति सम्म नोट लेख्न सकिन्छ。\n", MAX_LINES);
    for (int i = 0; i < MAX_LINES; i++) {
        printf("%d पंक्ति: ", i + 1);
        fgets(lines[i], sizeof(lines[i]), stdin);
        lines[i][strcspn(lines[i], "\n")] = ' ';
    }
    FILE *file = fopen("memo.txt", "w");
    if (file == NULL) {
        printf("फाइल खोल्न सकिएन。\n");
        return 1;
    }
    for (int i = 0; i < MAX_LINES; i++) {
        fprintf(file, "%s\n", lines[i]);
    }
    fclose(file);
    printf("नोट सुरक्षित गरियो。\n");
    return 0;
}

बुँदा:

  • Save user input to a file.
  • An applied example that lets you learn the basics of file operations.

7. अक्सर सोधिने प्रश्न(Q&A ढाँचा)

Q1: किन gets फलन प्रयोग नगर्नु राम्रो हुन्छ?

A:
gets फलनले इनपुट गरिएको स्ट्रिङको लम्बाइलाई सीमित नगरी लिन्छ, जसले बफर ओभरफ्लोको जोखिम उत्पन्न गर्छ। यो कमजोरीले सुरक्षा सम्बन्धी समस्याहरू उत्पन्न गर्ने कारण बनाउँछ, त्यसैले C11 पछि मानकमा यसलाई हटाइएको छ। त्यसको सट्टा, अधिक सुरक्षित fgets फलनको प्रयोग सिफारिस गरिन्छ।

उदाहरण: सुरक्षित वैकल्पिक कोड

char str[50];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';  // नयाँ पङ्क्ति वर्ण हटाउने

Q2: scanf फलनले किन खाली स्थान समावेश गर्ने इनपुट प्रक्रिया गर्न सक्दैन?

A:
scanf फलनले डिफल्ट रूपमा खाली स्थानका अक्षरहरू (स्पेस, ट्याब, नयाँ लाइन) लाई विभाजकको रूपमा मान्दछ, त्यसैले ती समावेश गर्ने स्ट्रिङलाई सही रूपमा प्रक्रिया गर्न सक्दैन।

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

Hello World

आउटपुट:

Hello

समाधान:
खाली स्थान समावेश गर्ने स्ट्रिङलाई प्रक्रिया गर्न चाहनुहुन्छ भने fgets प्रयोग गर्नुहोस्।

char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';
printf("प्रविष्ट गरिएको स्ट्रिङ: %s\n", str);

Q3: fgets फलनमा इनपुट आकारभन्दा बढी भएमा के गर्नु पर्छ?

A:
fgets ले निर्दिष्ट बफर आकारसम्म मात्र इनपुट स्वीकार्छ, त्यसैले धेरै लामो इनपुट काटी फालिन्छ।

समाधान:

  1. इनपुट त्रुटि हुँदा चेतावनी प्रदर्शन र पुनः प्रयास प्रक्रिया लागू गरिनेछ।
  2. getlineफङ्सन प्रयोग गरेर गतिशील रूपमा मेमोरी आवंटन गर्न सकिन्छ, र लामो स्ट्रिङहरूलाई पनि समर्थन गर्न सकिन्छ (POSIX वातावरण मात्र)।

कोड उदाहरण:

#include 
#include 
int main() {
    char *line = NULL;
    size_t len = 0;
    printf("कृपया स्ट्रिङ प्रविष्ट गर्नुहोस्: ");
    getline(&line, &len, stdin);  // गतिशील रूपमा मेमोरी सुरक्षित गर्नुहोस्
    printf("प्रविष्ट गरिएको स्ट्रिङ: %s", line);
    free(line);  // मेमोरी मुक्त गर्नुहोस्
    return 0;
}

Q4: fgets फलनमा नयाँ लाइन अक्षर बाँकी रहने समस्या कसरी समाधान गर्ने?

A:
fgets ले नयाँ लाइन अक्षर पनि समेटेर प्राप्त गर्छ, जसले आउटपुट गर्दा अतिरिक्त नयाँ लाइन उत्पन्न हुन सक्छ।

समाधान:
नयाँ लाइन अक्षरलाई म्यानुअली हटाउनुहोस्।

कोड उदाहरण:

char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';  // लाइन ब्रेक अक्षर हटाउनुहोस्
printf("प्रविष्ट गरिएको स्ट्रिङ: %s\n", str);

Q5: fgets फलनले अतिरिक्त इनपुट बफरमा बाँकी रहेमा के गर्नु पर्छ?

A:
fgets मा निर्दिष्ट आकारभन्दा बढी इनपुट भएमा, बाँकी स्ट्रिङ बफरमा रहन सक्छ। यसलाई सफा गर्न getchar प्रयोग गर्नुहोस्।

कोड उदाहरण:

char str[10];
fgets(str, sizeof(str), stdin);
// बफरमा अतिरिक्त स्ट्रिङ बचेको भएको प्रक्रिया
if (strchr(str, '\n') == NULL) {
    int c;
    while ((c = getchar()) != '\n' && c != EOF);  // नयाँ पङ्क्ति सम्म पढ्न नदिने
}
printf("प्रविष्ट गरिएको स्ट्रिङ: %s\n", str);

Q6: केवल अल्फान्यूमेरिक अक्षरहरूलाई अनुमति दिन चाहनुहुन्छ भने के गर्नु पर्छ?

A:
इनपुट फिल्टरिङ गरेर, अल्फान्यूमेरिक बाहेकका अक्षरहरू जाँचेर अस्वीकार गर्ने प्रक्रिया थप्नुहोस्।

कोड उदाहरण:

#include 
#include 
#include 
int isValidInput(const char *str) {
    for (int i = 0; str[i] != '\0'; i++) {
        if (!isalnum(str[i])) {  // अल्फान्यूमेरिक बाहेकका अक्षरहरू जाँच्ने
            return 0;
        }
    }
    return 1;
}
int main() {
    char str[50];
    printf("कृपया अल्फान्यूमेरिक मात्र प्रविष्टि गर्नुहोस्: ");
    fgets(str, sizeof(str), stdin);
    str[strcspn(str, "\n")] = '\0';
    if (isValidInput(str)) {
        printf("प्रविष्टि वैध छ: %s\n", str);
    } else {
        printf("प्रविष्टि अवैध छ।\n");
    }
    return 0;
}

Q7: बफर आकारभन्दा लामो स्ट्रिङलाई कसरी प्रक्रिया गर्ने?

A:
fgets मा लामो स्ट्रिङलाई भाग-भाग गरेर इनपुट गर्न वा getline फलन प्रयोग गरेर गतिशील मेमोरी सुरक्षित गरेर समाधान गर्न सकिन्छ।

उदाहरण:
पहिले प्रस्तुत गरिएको getline फलन प्रयोग गरेमा, ठूलो मात्राको इनपुट पनि ह्यान्डल गर्न सकिन्छ।

8. सारांश

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

1. स्ट्रिङ इनपुटको मूलभूत बुझ्नुहोस्

C भाषा मा स्ट्रिङहरूलाई क्यारेक्टर प्रकारको एरेको रूपमा प्रस्तुत गरिन्छ, र अन्त्य संकेतक\0 द्वारा समाप्त हुन्छ। यो मूलभूत अवधारणा बुझेर, स्ट्रिङ अपरेसनको आधारलाई दृढतापूर्वक समात्न सकियो।

2. इनपुट फलनको विशेषता र चयन

  • scanffunction: Because it cannot handle whitespace characters and has a risk of buffer overflow, caution is required.
  • fgetsfunction: Allows specifying the input size, enabling safe string input. Care must be taken with newline character handling, but it is generally recommended.
  • getlinefunction: Dynamically allocates memory and is suitable for handling large amounts of string input. However, it can only be used in POSIX-compliant environments.

3. सुरक्षित स्ट्रिङ इनपुटलाई व्यवहारमा ल्याउनु

सुरक्षा बढाउनका लागि तलका बुँदाहरूलाई लागू गरियो।

  1. बफर आकार व्यवस्थापन: आवश्यक भन्दा बढी ठूलो डेटा प्रविष्ट नगरिनुहोस् भनेर सीमा लगाउनुहोस्।
  2. नयाँ पङ्क्ति वर्णको प्रक्रिया: अनावश्यक लाइन ब्रेकहरू हटाउनुहोस्, र इनपुट डेटा सफा राख्नुहोस्।
  3. इनपुट प्रमाणीकरण: अवैध डेटा रोक्न फिल्टरिङ्ग लागू गर्ने, र त्रुटि प्रबन्धन तथा पुनः प्रयास प्रक्रियाहरू थप्ने।

यसले गर्दा, त्रुटि र सुरक्षा जोखिमलाई रोक्दै, सुरक्षित र व्यावहारिक प्रोग्राम निर्माण गर्न सम्भव भयो।

4. अनुप्रयोग उदाहरणहरूद्वारा व्यावहारिक क्षमता सुदृढीकरण

बहु-लाइन इनपुट र फाइल आउटपुटलाई समेट्ने अनुप्रयोग उदाहरणहरू मार्फत, व्यावहारिक स्ट्रिङ प्रोसेसिङ कौशल हासिल गरियो। विशेष गरी, 2‑आयामिक एरे र गतिशील मेमोरी व्यवस्थापन प्रयोग गरेर, अझ उन्नत प्रोग्रामहरूमा प्रयोग सम्भव छ भन्ने कुरा सिकियो।

5. प्रायः सोधिने प्रश्नहरूको समाधान सिक्नु

Q&A खण्डमा, पाठकहरूलाई अड्किन सजिलो हुने बुँदाहरूलाई विशिष्ट रूपमा प्रस्तुत गरियो।

  • getsfgetsgetline
  • Handling of whitespace and special characters.
  • Error handling when buffer size is exceeded and deletion of newline characters.

यी विशिष्ट उदाहरणहरूलाई सन्दर्भ गरेर, वास्तविक विकास स्थलमा पनि लागू गर्न सकिने कौशल प्राप्त हुन्छ।

6. भविष्यका चरणहरू र उन्नत अध्ययन

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

  1. स्ट्रिङ प्रोसेसिङ लाइब्रेरीको प्रयोग:
    मानक पुस्तकालय फङ्सन (strlen, strcmp, strcpyआदि प्रयोग गरेर स्ट्रिङ् सञ्चालनको अनुप्रयोग。
  2. डायनामिक मेमोरी व्यवस्थापन:
    mallocआदिreallocउपयोग गरेर लचिलो स्ट्रिङ् सञ्चालनको कार्यान्वयन।
  3. फाइल इनपुट/आउटपुट:
    विशाल डेटा प्रबन्ध गर्ने प्रोग्रामको डिजाइन र कार्यान्वयन।
  4. डेटा संरचना र एल्गोरिदम:
    स्ट्रिङ खोजी र सॉर्ट अल्गोरिदमको उपयोग गरेर उन्नत प्रोग्राम डिजाइन।

7. व्यावहारिक कार्यहरूको प्रस्ताव

अध्ययनलाई दृढ बनाउन, तलका कार्यहरूमा प्रयास गर्नुहोस्।

  1. कार्य १: नामसूची व्यवस्थापन प्रणालीको निर्माण
  • Create a program that manages data such as names and ages using multi-line input.
  1. असाइनमेंट 2: कीवर्ड खोज प्रोग्राम
  • Create a program that searches for strings matching the keyword entered by the user.
  1. असाइनमेंट 3: फाइल प्रोसेसिङ प्रयोग गरेर लग प्रणाली
  • Design a system that saves entered data to a file so it can be referenced later.

सारांशको सारांश

यस लेखमा, C भाषामा स्ट्रिङ इनपुटको मूलभूतदेखि उन्नतसम्मलाई समेटियो।
सबैभन्दा महत्वपूर्ण बुँदा:

  • Ensuring Security:and etc., use safe functions.
  • Buffer Management and Error Handling:
  • व्यावहारिक अनुप्रयोग: बहु-लाइन इनपुट र फाइल अपरेसनको प्रयोग गरेर उच्च स्तरीय प्रोग्राम उदाहरण।
    यीलाई राम्रोसँग बुझेर र अभ्यास गरेर, तपाईं C भाषा कौशललाई अझै सुधार गर्न सक्नुहुन्छ।