나는 printf와 아이디어를 가지고 에 일반 printf 을 호출하는 my_printf (...)와 그 결과를 특별한 함수로 보내는 sprintf를 작성하려고합니다. (나는 대부분의 플랫폼에서 printf와 비슷한 동작을하기 때문에 sprintf에 대해 생각해 보았습니다).sprintf와 일반 printf 모두에 데이터를 보내는 my_printf를 만드시겠습니까?
내 생각은 이런 짓을 작은 매크로를 작성했다 :
#define my_printf(X, Y...) do{ printf(X, ## Y); \ char* data = malloc(strlen(X)*sizeof(char)); \ sprintf(data, X, ## Y); \ other_print(data);\ free(data);}while(0)
을하지만 sprintf와이 X보다 훨씬 더 큰 크기로 문자열을 확장 할 수 있기 때문에, 이 방법은 거의 직접 나누기.
그리고 단지 malloc이 문제를 공격하는 잘못된 방법 인 것 같습니다. 그 이후로 나는 큰 식을 인쇄하고 싶을 때 미래와 하루로 문제를 옮길 것입니다 ...
누구든지이 문제를 공격하는 방법에 대해 더 좋은 아이디어가 있습니까? 또는 sprintf 결과가 얼마나 클지 알 수 있습니까?
감사 요한
업데이트 : 나는 printf와 반환 얼마나 많은 문자가, 을 인쇄하고 이미 매크로에서의 printf를 호출되기 때문에 그것을 을 추가하는 매우 쉬운 일이었다 잊었 int를 저장합니다.
#define buf_printf(X, Y...) do{ int len = printf(X, ## Y); \ char* data = malloc((len+1)*sizeof(char)); \ sprintf(data, X, ## Y); \ other_print(data);\ free(data);}while(0)
업데이트 : 나는 이것에 대해 생각하고 아마 좋은 생각이 무엇인지 ephemient 제안했다처럼 많이 보이는 정상적인 기능 를 사용 할 수 있습니다. 열쇠는 다른 printf 함수 v-version 인 (vprintf, vsprintf 및 vsnprintf) 인 것 같습니다. 그 점을 지적 해 주셔서 감사합니다.
다시 한번 감사 요한
불쾌한 매크로는 피할 수 없으므로 동의합니다.하지만 할당 할 버퍼가 얼마나 큰지 문제가있는 질문자에게 도움이된다고 생각하지 않습니다. –
edit는 이전의 코멘트를 false로 렌더링합니다 :-) –
예, sprintf()처럼 myprintf()의 호출자가 이미 충분히 큰 버퍼를 가지고 있다고 가정하여 질문을 잘못 읽었습니다. – paxdiablo