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?

 146
Author: alex, 2010-03-16

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.

 118
Author: Michael Kristofik,
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).

 77
Author: leonbloy,
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).

 28
Author: echristopherson,
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.

 16
Author: Hannu Balk,
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...

 11
Author: Justin Ethier,
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.

 11
Author: Thomas Matthews,
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ą.
 8
Author: Muhammed Abiola,
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.

 5
Author: Wesley Nyandika,
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.

 2
Author: Johan Engblom,
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().

 1
Author: thil,
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