struct DVDInfo *ReadStruct(void) {
struct DVDInfo *infoPtr;
int num;
char line[ kMaxLineLength ];
char *result;
infoPtr = malloc(sizeof(struct DVDInfo));
if (NULL == infoPtr) {
printf("Out of memory!!! Goodbye!\n");
exit(0);
}
printf("Enter DVD Title: ");
result = fgets(line, kMaxLineLength, stdin);
line[ strlen(line) - 1 ] = '\0';
infoPtr->title = MallocAndCopy(line);
printf("Enter DVD comment: ");
result = fgets(line, kMaxLineLength, stdin);
line[ strlen(line) - 1 ] = '\0';
infoPtr->comment = MallocAndCopy(line);
do {
printf("Enter DVD Rating (1-10): ");
scanf("%d", &num);
Flush();
}
while ((num < 1) || (num > 10));
infoPtr->rating = num;
printf("\n----------\n");
return(infoPtr);
}
मैंने इस कोड के बारे में एक और थ्रेड में स्टैक ओवरफ्लो पर एक अलग प्रश्न पूछा, लेकिन उस पर डबल अप नहीं करना चाहता - इन फ़ाइलों के अंत में शून्य को क्यों समाप्त किया जा रहा है fgets द्वारा पढ़ा जा रहा है? fgets वैसे भी टर्मिंग शून्य जोड़ता है, यह overkill नहीं है?fgets स्वाभाविक रूप से सी में एक समाप्ति शून्य डालता है?
सी पर्याप्त बफर लंघन के अवसर के रूप में यह है। जब कोई स्ट्रिंग सही ढंग से समाप्त हो जाती है, तो यह सुनिश्चित करने के लिए कार्य करने में समय लगेगा। (सी में एक स्ट्रिंग * सी में परिभाषा के अनुसार, एक एनयूएल के साथ एक वैध स्ट्रिंग होने के लिए समाप्त होना चाहिए) –
हां, यह अधिक है। –