Girdinin her zaman belirli bir biçimde olacağından (ve belki o zaman bile) emin olmadığınız sürece, kişiler (ve özellikle yeni başlayanlar), scanf("%s")
veya gets()
arabellek taşması korumasına sahip olmayan diğer işlevleri asla kullanmamalıdır .
Daha hatırla scanf
"biçimlendirilmiş tarama" için standları ve değerli az şey var daha az kullanıcı tarafından girilen verilerin daha biçimlendirilmiş. Giriş veri formatının tam kontrolüne sahipseniz, ancak genellikle kullanıcı girişi için uygun değilse idealdir.
Kullanım fgets()
( vardır taşma koruması tampon) bir dizeye girişinizi almak ve sscanf()
bunu değerlendirmek. Ayrıştırmadan sadece kullanıcının girdiği şeyi istediğiniz için sscanf()
, bu durumda gerçekten ihtiyacınız yok :
#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;
}