Patrzysz dla rodziny funkcji sprintf
. Ich ogólny format:
char output[80];
sprintf(output, "No record with name %s found\n", inputString);
Jednak sprintf
sama jest niezwykle niebezpieczne. Jest podatny na coś, co nazywa się przepełnieniem bufora. Co to oznacza, że sprintf nie ma pojęcia, jak duży jest ciąg znaków output
, więc chętnie napisze do niego więcej danych, niż jest to możliwe. Na przykład, będzie to skompilować czysto, ale nadpisze poprawny pamięć — i nie ma sposobu, aby sprintf
wie, że robi coś złego:
char output[10];
sprintf(output, "%s", "This string is too long");
Rozwiązaniem jest użycie funkcji jako snprintf
, która przyjmuje długość parametr:
char output[10];
snprintf(output, sizeof output, "%s", "This string is too long, but will be truncated");
lub, jeśli jesteś na systemie Windows, aby skorzystać z _sntprintf
warianty i przyjaciół, które chronią przed przepełniona albo ciągów wejściowych lub wyjściowych.
Zrób sobie przysługę i iść kupić "The C Programming Language" przez Kernigham & Ritchie. – Pete
Dzięki, Pete, zrobię to. – itsaboutcode
http://www.eskimo.com/~scs/cclass/cclass.html –