Wiem, że możesz drukować za pomocą printf()
i puts()
. Widzę również, że printf()
pozwala to na interpolację zmiennych i formatowanie.
Jest puts()
tylko prymitywną wersją printf()
. Czy powinien być używany na wszystkie możliwe sposoby printf()
bez interpolacji ciągów?
printf(variable)
aby wydrukować łańcuch. Użyjputs(variable)
lubprintf("%s', variable)
. Stosowanie łańcucha formatu zmiennej wiąże się z ryzykiem dla bezpieczeństwa: jeśli zmienna może zostać zapisana przez osobę atakującą, może zaatakować program przy użyciu ciągów formatu.Odpowiedzi:
puts
jest prostsze niż,printf
ale pamiętaj, że ta pierwsza automatycznie dołącza nową linię. Jeśli tego nie chcesz, możeszfputs
ustawić ciąg na standardowe wyjście lub użyćprintf
.źródło
(Wskazuje na to komentarz Zana Lynxa, ale myślę, że zasługuje na odpowiedź - biorąc pod uwagę, że przyjęta odpowiedź o tym nie wspomina).
Zasadnicza różnica między
puts(mystr);
iprintf(mystr);
polega na tym, że w drugim przypadku argument jest interpretowany jako łańcuch formatujący . Wynik będzie często taki sam (z wyjątkiem dodanego nowego wiersza), jeśli łańcuch nie zawiera żadnych znaków sterujących (%
), ale jeśli nie możesz na tym polegać (jeślimystr
jest to zmienna zamiast literału), nie powinieneś jej używać.Zatem generalnie niebezpieczne - i koncepcyjnie błędne - jest przekazywanie dynamicznego ciągu jako pojedynczego argumentu
printf
:To samo dotyczy
fputs
vsfprintf
(alefputs
nie dodaje nowej linii).źródło
printf()
byłoby mniej wydajne? W czasie wykonywania? W czasie kompilacji?printf
musi przeanalizować ciąg formatu. Jednak zwykle nie powinno to mieć znaczenia. Co więcej, sprytny kompilator mógłby to zoptymalizować i zastąpićprintf
wywołanieputs
Oprócz formatowania
puts
zwraca nieujemną liczbę całkowitą, jeśli zakończy się powodzeniem lubEOF
niepowodzeniem; whileprintf
zwraca liczbę wydrukowanych znaków (bez końcowego null).źródło
W prostych przypadkach kompilator konwertuje wywołania do
printf()
na wywołaniaputs()
.Na przykład następujący kod zostanie skompilowany do kodu asemblera, który pokażę dalej.
W tym przykładzie użyłem GCC w wersji 4.7.2 i skompilowałem źródła z
gcc -o hello hello.c
.źródło
printf("Hello world!\n");
rzeczywiście zostać przetłumaczony przez gcc na puts. Ponieważ jest to stara wiadomość, samodzielnie ją edytuję.-save-temps
opcja dla gcc to robiRacja,
printf
można to uznać za mocniejszą wersjęputs
.printf
zapewnia możliwość formatowania zmiennych wyjściowych w formacie dla specyfikatorami takich jak%s
,%d
,%lf
itp ...źródło
Z mojego doświadczenia
printf()
wynika , że zaciąga więcej kodu niżputs()
niezależnie od ciągu formatu.Jeśli nie potrzebuję formatowania, nie używam
printf
. Jednak,fwrite
abystdout
działa dużo szybciej niżputs
.Uwaga: na komentarz „\ 0” jest stałą liczbą całkowitą. Prawidłowe wyrażenie powinno być
sizeof(char)
zgodne z komentarzami.źródło
'\0'
ma typint
, więc w większości systemów będzie to drukowaneUsing fwrit
. Jeśli chcesz wydrukować 1 bajt mniej, po prostu użyj 1.sizeof (char)
, co jest prawdopodobnie tym, co zamierzałeś tutaj, na pewno będzie 1.puts () zapisuje łańcuch si końcowy znak nowej linii na standardowe wyjście.
Funkcja printf () zapisuje dane wyjściowe na standardowe wyjście, pod kontrolą łańcucha formatu, który określa, w jaki sposób kolejne argumenty są konwertowane na wyjście.
Skorzystam z okazji, aby poprosić o przeczytanie dokumentacji.
źródło
funkcja printf () jest używana do drukowania zarówno łańcuchów, jak i zmiennych na ekranie, podczas gdy funkcja puts () pozwala tylko na wydrukowanie ciągu tylko na ekranie.
źródło
puts
jest prostym wyborem i dodaje nowy wiersz na końcu iprintf
zapisuje wynik ze sformatowanego ciągu.Zobacz dokumentację dla
puts
i dlaprintf
.printf
Zalecałbym używanie tylko, ponieważ jest to bardziej spójne niż metoda przełączania, tj. Jeśli debbugujesz, przeszukiwanie wszystkich printfs jest mniej bolesne niżputs
iprintf
. W większości przypadków chcesz wypisać zmienną również na swoich wydrukach, więcputs
jest ona najczęściej używana w przykładowym kodzie.źródło
Podczas porównywania
puts()
iprintf()
, mimo że ich zużycie pamięci jest prawie takie samo,puts()
zajmuje więcej czasu w porównaniu zprintf()
.źródło