Odróżniam. Nie zrozumieliśmy się o co mi chodziło, wyjaśnię ponownie. Chodzi mi o to, że rozmiar bufora, do którego możesz wczytać dane może być dynamiczny - niezależny od tego co wpisze użytkownik (czy też co wczyta się w pliku przy pomcy fscanf). To przypadek #3 powyżej. Twierdzę, że API czytające dane z pliku nie powinno mieć ciągu formatującego. Konieczność zbudowania go przy pomocy sprintf w w/w przypadku uważam za absurd. Możesz się nie zgadać, nic mi do tego. Nie zmienia to faktu, że scanf nie jest sensowną funkcją. Co więcej żaden z podanych przez Ciebie przykładów nie odpowiada na pytanie jak automagicznie zaktualizować ciąg formatujący w przypadku, gdy bufor ma zadany ręcznie rozmiar, ale ktoś w kodzie zmieni wielkość bufora na mniejszy.
Co jest złego w tym kodzie?
int foo()
{
if (something > 100)
return 1;
else
return 0;
}
...
if (foo() == 1)
printf("bar");
To chyba jasne - rozrzucone po kodzie magiczne wartości (tutaj: 1). Jeśli zmienisz foo tak, że zwraca coś innego, każde miejsce w kodzie w którym polegałeś na wcześniej zwracanych wartościach musi ulec zmianie. Zły kod, prawda? Analogicznie jest ze scanf:
char buf[100];
...
scanf("%100s", buf);
Co się stanie jeśli ktoś zmieni buf[100] na buf[20]? Nic, *jeżeli* aktualizacji ulegnie także scanf. Czy nie lepiej byłoby, gdyby zmiana w jednym miejscu propagowała się wszędzie?
const size_t bufLen = 100;
char buf[bufLen];
...
scanf_s("%s", buf, bufLen);
W przypadku gołego scanf potrzeba albo ręcznej zmiany, albo budowania ciągu formatującego sprintf. Wybacz, ale to *nie* jest dobrze zaprojektowane, wygodne i bezpieczne API. (swoją drogą sprintf_s też ssie z uwagi na to jak się podaje parametry i to, że wciąż jest zbędny ciąg formatujący)
I taka drobna prośba. Nie zwracaj się do mnie protekcjonalnie, ładnie proszę. Ignoruję tego typu komentarze bo nie o wojnę mi chodzi, ale taki ton naprawdę psuje atmosferę. Z góry dziękuję.