Oprócz innych dobrze wyjaśnionych odpowiedzi, z uwzględnieniem wszelkich wątpliwości pobocznych, chciałbym udzielić dokładnej i zwięzłej odpowiedzi na zadane pytanie.
Dlaczego printf
pojedynczy argument (bez specyfikatorów konwersji) jest przestarzały?
printf
Wywołanie funkcji za pomocą jednego argumentu w ogóle jest nie przestarzałe i również nie ma słabych punktów , gdy stosowane właściwie jak zawsze będą kodować.
C Użytkownicy z całego świata, od początkujących do ekspertów zajmujących się statusem, używają printf
tego sposobu, aby przekazać do konsoli prostą frazę tekstową.
Co więcej, ktoś musi rozróżnić, czy ten jedyny argument jest literałem ciągu, czy wskaźnikiem do łańcucha, który jest prawidłowy, ale często nie jest używany. W tym ostatnim przypadku mogą oczywiście wystąpić niewygodne dane wyjściowe lub dowolny rodzaj niezdefiniowanego zachowania , gdy wskaźnik nie jest ustawiony prawidłowo, aby wskazywał na prawidłowy ciąg, ale te rzeczy mogą również wystąpić, jeśli specyfikatory formatu nie pasują do odpowiednich argumentów, dając wiele argumentów.
Oczywiście nie jest również właściwe i właściwe, aby łańcuch, podany jako jeden i jedyny argument, miał jakikolwiek specyfikator formatu lub konwersji, ponieważ konwersja nie będzie miała miejsca.
To powiedziawszy, podając prosty literał ciągu, taki jak "Hello World!"
jako jedyny argument bez żadnych specyfikatorów formatu wewnątrz tego ciągu, tak jak podałeś go w pytaniu:
printf("Hello World!");
nie jest przestarzały ani nie jest „ złą praktyką” ”, ani nie ma żadnych luk w zabezpieczeniach.
W rzeczywistości wielu programistów C zaczyna i zaczyna uczyć się i używać języka C, a nawet ogólnie języków programowania, z tym programem HelloWorld i tym printf
oświadczeniem jako pierwszymi w swoim rodzaju.
Nie byłyby takie, gdyby zostały wycofane.
W książce, którą czytam, jest napisane, że printf
pojedynczy argument (bez specyfikatorów konwersji) jest przestarzały.
Cóż, wtedy skupiłbym się na książce lub samym autorze. Jeśli autor naprawdę robi takie, moim zdaniem, błędne twierdzenia, a nawet naucza, że bez wyraźnego wyjaśnienia, dlaczego to robi (jeśli te twierdzenia są naprawdę dosłownie równoważne w tej książce), uznałbym ją za złą książkę. W przeciwieństwie do tego dobra książka powinna wyjaśniać, dlaczego należy unikać pewnego rodzaju metod lub funkcji programowania.
Zgodnie z tym, co powiedziałem powyżej, używanie printf
tylko jednego argumentu (literału ciągu znaków) i bez żadnych specyfikatorów formatu nie jest w żadnym wypadku uznawane za przestarzałe ani uważane za „złą praktykę” .
Powinieneś zapytać autora, co miał na myśli, a nawet lepiej, zwróć uwagę, aby wyjaśnił lub poprawił odpowiednią sekcję dla następnego wydania lub w ogóle.
printf("Hello World!")
to nie to samo coputs("Hello World!")
.puts()
dołącza plik'\n'
. Zamiast tego porównajprintf("abc")
zfputs("abc", stdout)