[c] C에서 printf ()와 puts ()의 차이점은 무엇입니까?

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

fputsvs 에도 동일하게 적용 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에 기록합니다.

이 기회를 이용하여 문서를 읽도록 요청할 것입니다.