Mọi người (và đặc biệt là người mới bắt đầu) không bao giờ nên sử dụng scanf("%s")
hoặc gets()
bất kỳ chức năng nào khác không có bảo vệ chống tràn bộ đệm, trừ khi bạn biết chắc chắn rằng đầu vào sẽ luôn có định dạng cụ thể (và có lẽ thậm chí là không).
Ghi nhớ hơn scanf
là viết tắt của "quét được định dạng" và có ít định dạng ít hơn so với dữ liệu do người dùng nhập. Thật lý tưởng nếu bạn có toàn quyền kiểm soát định dạng dữ liệu đầu vào nhưng thường không phù hợp với đầu vào của người dùng.
Sử dụng fgets()
( có bảo vệ chống tràn bộ đệm) để đưa đầu vào của bạn vào một chuỗi và sscanf()
để đánh giá nó. Vì bạn chỉ muốn những gì người dùng đã nhập mà không cần phân tích cú pháp, nên bạn không thực sự cần sscanf()
trong trường hợp này:
#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;
}