Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> सी प्रोग्रामिंग

C प्रोग्रामिंग में scanf() के बाद स्ट्रिंग न पढ़ने की समस्या


समस्या

scanf() से पूर्णांक पढ़ने के बाद gets() या scanf("%s") से स्ट्रिंग पढ़ने पर स्ट्रिंग छोड़ दी जाती है।

कारण

scanf("%d", &n) संख्या पढ़ता है लेकिन नई लाइन (\n) बफर में छोड़ देता है। बाद में gets() या scanf("%s") उस \n को देखता है और तुरंत समाप्त हो जाता है (खाली स्ट्रिंग)।

समाधान

  1. अतिरिक्त scanf("%c") से नई लाइन खपत करें
  2. fgets() उपयोग करें (सुरक्षित, पूरी लाइन पढ़ता है)
  3. scanf() फॉर्मेट में स्पेस: " %s" या " %[^\n]"

समाधान 1: अस्थायी char पढ़ें

#include <stdio.h>

struct Student {
    char name[50];
    int roll;
    char temp;  // बफर खपत के लिए
};

int main() {
    struct Student s;
    
    printf("रोल नंबर: ");
    scanf("%d", &s.roll);
    scanf("%c", &s.temp);  // \n खपत करें
    
    printf("नाम: ");
    fgets(s.name, sizeof(s.name), stdin);
    
    // fgets \n शामिल करता है, हटाएं
    size_t len = strlen(s.name);
    if (len > 0 && s.name[len-1] == '\n')
        s.name[len-1] = '\0';
    
    printf("\nरोल: %d\nनाम: %s\n", s.roll, s.name);
    return 0;
}

समाधान 2: fgets() + sscanf() (अनुशंसित)


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

int main() {
    char line[100];
    int roll;
    char name[50];
    
    printf("रोल नंबर: ");
    fgets(line, sizeof(line), stdin);
    roll = atoi(line);  // या sscanf(line, "%d", &roll)
    
    printf("नाम: ");
    fgets(name, sizeof(name), stdin);
    name[strcspn(name, "\n")] = '\0';  // \n हटाएं
    
    printf("रोल: %d, नाम: %s\n", roll, name);
    return 0;
}

समाधान 3: scanf() में अग्रणी स्पेस


int roll;
char name[50];

scanf("%d", &roll);
scanf(" %49[^\n]", name);  // %c/%s/%[ से पहले स्पेस व्हाइटस्पेस छोड़ता है

तुलना

विधिपक्षविपक्ष
temp charसरलकेवल एक वर्ण खपत, एकाधिक \n विफल
fgets + sscanfसुरक्षित, पूरी लाइन, बफर ओवरफ्लो नहींथोड़ा अधिक कोड
scanf(" %s")संक्षिप्तस्पेस नहीं पढ़ता, बफर ओवरफ्लो संभव
scanf(" %[^\n]")स्पेस सहित पूरी लाइनबफर आकार सीमा (width specifier आवश्यक)

सर्वोत्तम अभ्यास

✅ अनुशंसित पैटर्न


// 1. पूर्णांक पढ़ें
int n;
char line[100];
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &n);

// 2. स्ट्रिंग पढ़ें
char str[100];
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")] = '\0';  // नई लाइन हटाएं

यह सबसे मजबूत है: कोई बफर समस्या नहीं, स्पेस संभालता है, आकार सीमा सम्मान करता है।

महत्वपूर्ण: gets() कभी उपयोग न करें

  • gets() C11 में हटाया गया, असुरक्षित (बफर ओवरफ्लो)
  • हमेशा fgets() या scanf() विद विड्थ उपयोग करें
  1. पायथन प्रोग्राम: जांचें कि स्ट्रिंग खाली है या नहीं पायथन प्रोग्राम: जांचें कि स्ट्रिंग खाली है या नहीं

    इस लेख में, हम दिए गए प्रॉब्लम स्टेटमेंट को हल करने के समाधान और दृष्टिकोण के बारे में सीखेंगे। प्रॉब्लम स्टेटमेंट एक स्ट्रिंग इनपुट दिए जाने पर, हमें जांचना होगा कि स्ट्रिंग खाली है या नहीं। पायथन स्ट्रिंग्स प्रकृति में इम्यूटेबल होती हैं इसलिए किसी भी ऑपरेशन को करते समय स्ट्रिंग्स को संभालते समय

  1. BIOS अपडेट के बाद TPM आरंभ नहीं हो सका BIOS अपडेट के बाद TPM आरंभ नहीं हो सका

    यदि आपके Windows 11 या Windows 10 कंप्यूटर पर BIOS अपडेट के बाद, और आप अपना सिस्टम बूट करते हैं लेकिन BIOS स्प्लैश स्क्रीन के बाद आपको त्रुटि संदेश The TPM could not be initialized प्राप्त होता है जो आपको या तो OS को बूट जारी रखने या सेटअप उपयोगिता तक पहुंचने से रोकता है, तो यह पोस्ट इस समस्या को हल

  1. व्हाट्सऐप नोटिफिकेशन ठीक करें: अलर्ट और प्रीव्यू बहाल करने के 7 सिद्ध चरण व्हाट्सऐप नोटिफिकेशन ठीक करें: अलर्ट और प्रीव्यू बहाल करने के 7 सिद्ध चरण

    क्यों व्हाट्सऐप नोटिफिकेशन अब काम नहीं कर रहे? कभी-कभी नोटिफिकेशन में कोई आवाज नहीं होती जबकि अन्य समय यह संदेश पूर्वावलोकन नहीं दिखाता। खैर, इसके पीछे कई कारण हो सकते हैं। यह हालिया व्हाट्सऐप अपडेट, अस्थिर इंटरनेट कनेक्शन, डेटा प्रतिबंध, ऐप कैश, या शायद फर्मवेयर समस्याओं के कारण हो सकता है। किसी भी