printf()
및로 인쇄 할 수 있다는 것을 알고 있습니다 puts()
. printf()
변수를 보간하고 서식을 지정할 수 있다는 것도 알 수 있습니다.
인가 puts()
단지의 원시적 버전 printf()
. printf()
문자열 보간없이 가능한 모든 경우에 사용해야합니까 ?
답변
puts
보다 간단 printf
하지만, 전자는 자동으로 줄 바꿈을 추가 것을 유의하십시오. 그것이 원하는 것이 아니라면 fputs
문자열을 stdout하거나 사용할 수 있습니다 printf
.
답변
(이것은 Zan Lynx의 의견에서 지적되었지만 허용 된 답변에 언급되어 있지 않다는 점을 고려할 때 가치가 있다고 생각합니다).
사이의 근본적인 차이 puts(mystr);
와는 printf(mystr);
후자에 인수가로 해석이다 서식 문자열 . 문자열에 제어 문자 ( %
)가 포함되지 않은 경우 결과는 종종 동일하지만 (추가 된 줄 바꿈 제외), 그에 의존 할 수없는 경우 ( mystr
리터럴 대신 변수 인 경우 ) 사용 해서는 안됩니다 .
따라서 동적 문자열을 단일 인수로 전달하는 것은 일반적으로 위험하며 개념적으로 잘못 되었습니다 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
fputs
vs 에도 동일하게 적용 fprintf
되지만 fputs
개행을 추가하지는 않습니다.
답변
형식화 외에도 puts
성공하거나 EOF
실패 하면 음이 아닌 정수를 리턴합니다 . while printf
은 인쇄 된 문자 수 를 반환합니다 (후미 널은 포함하지 않음).
답변
간단한 경우, 컴파일러 개종자는 호출 printf()
에 대한 호출에 puts()
.
예를 들어 다음 코드는 다음에 표시 할 어셈블리 코드로 컴파일됩니다.
#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
이 예에서는 GCC 버전 4.7.2를 사용하고로 소스를 컴파일했습니다 gcc -o hello hello.c
.
답변
마우스 오른쪽 단추로, printf
보다 강력한 버전으로 간주 할 수있다 puts
. printf
하는 기능을 제공 포맷 등과 같은 출력하여 포맷 지정자 변수 %s
, %d
, %lf
, 등 …
답변
내 경험 에 따르면 형식 문자열에 관계없이 printf()
더 많은 코드를 puts()
사용합니다.
서식이 필요하지 않으면을 사용하지 않습니다 printf
. 그러나, fwrite
에가 stdout
많은 것보다 더 빨리 작동합니다 puts
.
static const char my_text[] = "Using fwrite.\n";
fwrite(my_text, 1, sizeof(my_text) - sizeof('\0'), stdout);
참고 : 주석마다 ‘\ 0’은 정수 상수입니다. 올바른 표현은 sizeof(char)
주석으로 표시된 것과 같아야합니다 .
답변
int puts(const char *s);
puts () 는 문자열 s와 후행 줄 바꿈을 stdout에 씁니다.
int printf(const char *format, ...);
printf () 함수 는 후속 인수가 출력을 위해 변환되는 방법을 지정하는 형식 문자열의 제어하에 출력을 stdout에 기록합니다.
이 기회를 이용하여 문서를 읽도록 요청할 것입니다.