Ludzie (a zwłaszcza początkujący) nigdy nie powinni używać scanf("%s")
ani gets()
żadnych innych funkcji, które nie mają ochrony przed przepełnieniem bufora, chyba że wiesz na pewno, że dane wejściowe zawsze będą w określonym formacie (a może nawet wtedy).
Pamiętaj, że scanf
oznacza to „skan sformatowany” i jest niewiele mniej sformatowanych niż dane wprowadzone przez użytkownika. Jest to idealne rozwiązanie, jeśli masz całkowitą kontrolę nad formatem danych wejściowych, ale generalnie nie nadaje się do wprowadzania danych przez użytkownika.
Użyj fgets()
(który ma ochronę przed przepełnieniem buforu), aby uzyskać dane wejściowe w łańcuchu i sscanf()
ocenić je. Ponieważ chcesz tylko tego, co wprowadził użytkownik bez przetwarzania, tak naprawdę nie potrzebujesz sscanf()
w tym przypadku:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_NAME_SZ 256
int main(int argC, char *argV[]) {
char *name = malloc(MAX_NAME_SZ);
if (name == NULL) {
printf("No memory\n");
return 1;
}
printf("What is your name? ");
fgets(name, MAX_NAME_SZ, stdin);
if ((strlen(name) > 0) && (name[strlen (name) - 1] == '\n'))
name[strlen (name) - 1] = '\0';
printf("Hello %s. Nice to meet you.\n", name);
free (name);
return 0;
}