লোকেদের (এবং বিশেষত নতুনদের) কখনই scanf("%s")
বা gets()
অন্য কোনও ফাংশন ব্যবহার করা উচিত নয় বা বাফার ওভারফ্লো সুরক্ষা নেই এমন কোনও ফাংশন ব্যবহার করা উচিত নয় , যদি না আপনি নিশ্চিত হন না যে ইনপুটটি সর্বদা নির্দিষ্ট বিন্যাসে থাকবে (এবং সম্ভবত তখনও নয়)।
scanf
"স্ক্যান ফর্ম্যাটেড" এর চেয়ে বেশি মনে রাখবেন এবং ব্যবহারকারীর দ্বারা প্রবেশ করা ডেটার চেয়ে মূল্যবান সামান্য কম ফর্ম্যাট রয়েছে। আপনার যদি ইনপুট ডেটা ফর্ম্যাটটির মোট নিয়ন্ত্রণ থাকে তবে সাধারণত ব্যবহারকারী ইনপুট জন্য অনুপযুক্ত It's
আপনার ইনপুটটিকে স্ট্রিংয়ে আনতে এবং এটি মূল্যায়ন করতে 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;
}