ผู้คน (และโดยเฉพาะผู้เริ่มต้น) ไม่ควรใช้scanf("%s")
หรือgets()
หรือฟังก์ชั่นอื่น ๆ ที่ไม่มีการป้องกันการล้นของบัฟเฟอร์เว้นแต่คุณจะทราบอย่างชัดเจนว่าอินพุตจะอยู่ในรูปแบบเฉพาะเสมอ
จำไว้ว่าscanf
ย่อมาจาก "scan formatted" และมีรูปแบบที่มีค่าน้อยกว่าข้อมูลที่ผู้ใช้ป้อน เหมาะอย่างยิ่งหากคุณมีการควบคุมทั้งหมดของรูปแบบข้อมูลอินพุต แต่โดยทั่วไปไม่เหมาะสมสำหรับอินพุตของผู้ใช้
ใช้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;
}