लोग (और विशेष रूप से शुरुआती) का उपयोग नहीं किया जाना चाहिए scanf("%s")
या gets()
या किसी अन्य कार्यों कि बफर अतिप्रवाह सुरक्षा की जरूरत नहीं है, जब तक आप कुछ के लिए पता है कि इनपुट हमेशा एक विशिष्ट प्रारूप (और शायद तब भी नहीं) के लिए किया जाएगा।
याद रखें scanf
"स्कैन स्वरूपित" के लिए खड़ा है और उपयोगकर्ता द्वारा दर्ज किए गए डेटा की तुलना में बहुत कम कीमती है । यह आदर्श है यदि आपके पास इनपुट डेटा प्रारूप का कुल नियंत्रण है, लेकिन आमतौर पर उपयोगकर्ता इनपुट के लिए अनुपयुक्त है।
का प्रयोग करें fgets()
(जो है अतिप्रवाह संरक्षण बफर) एक स्ट्रिंग में अपने इनपुट पाने के लिए और sscanf()
यह मूल्यांकन करने के लिए। चूंकि आप बस यह चाहते हैं कि उपयोगकर्ता ने बिना पार्स किए क्या दर्ज किया, इसलिए आपको sscanf()
इस मामले में वास्तव में कोई भी ज़रूरत नहीं है:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* Maximum name size + 1. */
#define MAX_NAME_SZ 256
int main(int argC, char *argV[]) {
/* Allocate memory and check if okay. */
char *name = malloc(MAX_NAME_SZ);
if (name == NULL) {
printf("No memory\n");
return 1;
}
/* Ask user for name. */
printf("What is your name? ");
/* Get the name, with size limit. */
fgets(name, MAX_NAME_SZ, stdin);
/* Remove trailing newline, if there. */
if ((strlen(name) > 0) && (name[strlen (name) - 1] == '\n'))
name[strlen (name) - 1] = '\0';
/* Say hello. */
printf("Hello %s. Nice to meet you.\n", name);
/* Free memory and exit. */
free (name);
return 0;
}