सामान्य त्रुटि
scanf() से संख्यात्मक डेटा पढ़ने के बाद स्ट्रिंग पढ़ने पर इनपुट छोड़ दिया जाता है।
कारण
scanf("%d", &num) संख्या पढ़ता है लेकिन अनुगामी नई लाइन (\n) इनपुट बफर में छोड़ देता है। अगला gets() या scanf("%s") उस \n को देखता है और तुरंत लौट आता है।
त्रुटिपूर्ण कोड
#include <stdio.h>
struct Student {
char name[10];
int roll;
};
int main() {
struct Student s;
printf("रोल नंबर: ");
scanf("%d", &s.roll); // \n बफर में रह जाता है
printf("नाम: ");
gets(s.name); // \n देखता है, खाली स्ट्रिंग पढ़ता है
printf("रोल: %d, नाम: %s\n", s.roll, s.name);
return 0;
}
आउटपुट
रोल नंबर: 3 नाम: रोल: 3, नाम:
समाधान
// विधि 1: अस्थायी char
scanf("%d", &s.roll);
getchar(); // या scanf("%c", &temp); // \n खपत
// विधि 2: fgets() उपयोग करें (सर्वोत्तम)
fgets(s.name, sizeof(s.name), stdin);
s.name[strcspn(s.name, "\n")] = '\0';
// विधि 3: scanf में स्पेस
scanf(" %9[^\n]", s.name); // अग्रणी स्पेस व्हाइटस्पेस छोड़ता है
सही प्रोग्राम
#include <stdio.h>
#include <string.h>
struct Student {
char name[50];
int roll;
};
int main() {
struct Student s;
char line[100];
printf("रोल नंबर: ");
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &s.roll);
printf("नाम: ");
fgets(s.name, sizeof(s.name), stdin);
s.name[strcspn(s.name, "\n")] = '\0';
printf("\n--- छात्र जानकारी ---\n");
printf("रोल नंबर: %d\n", s.roll);
printf("नाम: %s\n", s.name);
return 0;
}
आउटपुट
रोल नंबर: 3 नाम: TutorialsPoint --- छात्र जानकारी --- रोल नंबर: 3 नाम: TutorialsPoint
scanf() रिटर्न मान जांचना
scanf() सफलतापूर्वक पढ़े गए आइटम्स की संख्या लौटाता है। हमेशा जांचें:
if (scanf("%d", &n) != 1) {
// त्रुटि: इनपुट पूर्णांक नहीं था
// बफर साफ करें
while (getchar() != '\n');
}
सारांश: इनपुट हैंडलिंग चेकलिस्ट
- ✅
gets()कभी उपयोग न करें - ✅
fgets()+sscanf()पसंद करें - ✅
scanf()रिटर्न मान जांचें - ✅ बफर आकार सीमित करें (
%49s,%49[^\n]) - ✅ मिश्रित इनपुट के लिए पूरी लाइन पढ़कर पार्स करें