Jaka jest różnica między printf () a puts () w C?
Wiem, że możesz drukować za pomocą printf()
i puts()
. Widzę też, że printf()
pozwala na interpolację zmiennych i formatowanie.
Jest puts()
jedynie prymitywną wersją printf()
. Czy powinno być używane dla każdego możliwego printf()
bez interpolacji string?
10 answers
puts
jest prostsze niż printf
, ale należy pamiętać, że pierwsza automatycznie dodaje nowy wiersz. Jeśli nie tego chcesz, możesz fputs
swój łańcuch użyć do stdout lub użyć printf
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-16 13:06:06
(zaznaczono to w komentarzu Zana Lynxa, ale myślę, że zasługuje na aswera-biorąc pod uwagę, że przyjęta odpowiedź o tym nie wspomina).
Zasadnicza różnica pomiędzy puts(mystr);
i printf(mystr);
polega na tym, że w tym drugim argumencie jest interpretowany jako ciąg formatujący . Wynik będzie często taki sam (z wyjątkiem dodanego znaku nowego wiersza), jeśli łańcuch znaków nie zawiera znaków sterujących (%
), ale jeśli nie możesz na tym polegać (jeśli mystr
jest zmienną zamiast literału) powinien Nie używać.
Więc, ogólnie niebezpieczne - i koncepcyjnie błędne - jest przekazywanie dynamicznego ciągu jako pojedynczego argumentu printf
:
char * myMessage;
// ... myMessage gets assigned at runtime, unpredictable content
printf(myMessage); // <--- WRONG! (what if myMessage contains a '%' char?)
puts(myMessage); // ok
printf("%s\n",myMessage); // ok, equivalent to the previous, perhaps less efficient
To samo dotyczy fputs
vs fprintf
(ale fputs
nie dodaje nowej linii).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-08 12:32:37
Poza formatowaniem, puts
zwraca nonnegatywną liczbę całkowitą, jeśli się powiodło lub EOF
jeśli się nie powiodło; podczas gdy printf
Zwraca liczbę wydrukowanych znaków(Bez kończącego się null).
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-17 08:04:55
W prostych przypadkach kompilator konwertuje wywołania na {[2] } na wywołania na puts()
.
Na przykład poniższy kod zostanie skompilowany do kodu złożenia, który pokażę dalej.
#include <stdio.h>
main() {
printf("Hello world!");
return 0;
}
push rbp
mov rbp,rsp
mov edi,str.Helloworld!
call dword imp.puts
mov eax,0x0
pop rbp
ret
W tym przykładzie użyłem GCC w wersji 4.7.2 i skompilowałem Źródło za pomocą gcc -o hello hello.c
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-18 10:45:48
Racja, printf
można by uznać za mocniejszą wersję puts
. printf
zapewnia możliwość formatowania zmiennych dla wyjścia za pomocą specyfikacji formatu, takich jak %s
, %d
, %lf
, itd...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 00:45:57
Z mojego doświadczenia wynika, że printf()
zawiera więcej kodu niż puts()
niezależnie od formatu.
Jeśli nie potrzebuję formatowania, nie używam printf
. Jednak fwrite
do stdout
działa znacznie szybciej niż puts
.
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
Uwaga: w komentarzu '\0 ' jest stałą całkowitą. Poprawnym wyrażeniem powinno być sizeof(char)
, jak wskazują komentarze.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-04 18:08:16
int puts(const char *s);
Puts () zapisuje ciąg znaków s i końcową linię nowego wiersza na stdout.
int printf(const char *format, ...);
Funkcja printf () zapisuje wyjście na stdout, pod kontrolą formatu, który określa, jak kolejne argumenty są konwertowane na wyjście.
Skorzystam z okazji i poproszę o zapoznanie się z dokumentacją.Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-16 18:17:52
Funkcja printf() jest używana do drukowania zarówno łańcuchów, jak i zmiennych na ekranie, podczas gdy funkcja puts() pozwala na drukowanie łańcuchów tylko na ekranie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-06-11 05:24:53
Puts jest prostym wyborem i dodaje nową linię na końcu, a printf zapisuje wyjście ze sformatowanego łańcucha. Dokumentacja dla puts: http://linux.die.net/man/3/puts i dla printf: http://linux.die.net/man/3/printf
Polecam używać tylko printf, ponieważ jest to bardziej spójne niż metoda przełączania, tzn. jeśli debbugujesz, wyszukiwanie wszystkich printf jest mniej bolesne niż puts i printf. Najczęściej chcesz wypisać zmienną w wydrukach jako Cóż, więc puts jest najczęściej używany w przykładowym kodzie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-16 12:16:42
Podczas porównywania puts()
i printf()
, mimo że ich zużycie pamięci jest prawie takie samo, puts()
zajmuje więcej czasu w porównaniu do printf()
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-11 11:56:33