2010-12-08 5 views
0

concatenateNUL 너비가 포함 된 문자열을 종료하는 것이 적절한 방법인지 궁금합니다. null 종결 추가 하나가 있기 때문에문자열과 snprintf를 C로 연결

#define FOO "foo" 
const char *bar = "bar"; 
int n = 10; 
float f = 10.2; 

char *s; 
int l; 

l = snprintf (NULL, 0, "%-6s %-10s %4d %4f",FOO, bar, n, f); 
s = malloc (l + 4); // should it be the number of formats tags? 
if (s == null) return 1; 
sprintf (s, "%-6s %-10s %4d %4f", FOO, bar, n, f); 
+0

유지 보수 목적으로'snprintf'와'sprintf' 둘 다에서 사용되는 하나의 형식 문자열을 정의하는 것이 좋습니다. 그것은 한 곳에서 변경된 것이고 다른 곳에서는 변경되지 않았다면 정말 짜증이납니다! –

+0

좋은 아이디어 인 것 같습니다. 샘플 코드를 게시하는 것이 가능합니까? 감사합니다 – Lucas

+1

그냥'const char * fmt_str = "% -6s % -10s % 4d % 4f";'와 같은 것을 선언하고 두 곳에서 그것을 포맷 문자열로 사용하십시오. –

답변

0

는 당신은, snprintf()에 의해 반환 된 값에 1를 추가해야합니다.

그러나 l == -1 (snprintf()이 실패했음을 나타냄)을 확인해야합니다.

+0

'snprintf'는 원래의 C89에서 정의되지 않았고, C99와 호환되지 않는 구현이있는 몇 가지 플랫폼이 있다고 생각합니다. 그러나 C99에서는'snprintf (NULL, ...)'가 way OP는 그것을 여기에서 사용한다. – ephemient

+0

@ephemient : 그렇습니다. 저는 그 비트를 제거했습니다. – caf

+0

알았어요, 고마워! – Lucas

1

상당수의 시스템에는 표준 C 라이브러리에있는 정확히함수가 있습니다. 여기서는 allocate 및 sprintf입니다.