2011-10-26 3 views

답변

75

당신은 내가 코드 이상 생각하지 않는다 즉, 오히려 형식 문자열로 하드 코딩보다 printf()

void f(const char *str, int str_len) 
{ 
    printf("%.*s\n", str_len, str); 
} 
+1

'str_len' 인자는'int' 타입 (또는 더 좁은 정수 타입,'int'으로 승격 됨)을 가져야합니다. 'long','size_t' 등을 넘기는 것은 버그 일 것입니다. –

+2

이 코드의 목적은 특히'% s '와 함께 사용하는 경우 원래 문자열의 하위 문자열을 출력하는 것입니다. 이 사용 예제에서'str'은 원래 문자열 안의 어딘가를 가리키고 (시작 부분에있을 수도 있음),'str_len'은 인쇄되어야 할 부분 문자열의 길이를 지정합니다. –

11

을 폭 지정자/정밀도를 전달하는 별표 (*)를 사용할 수는 정확 그러나 (printf()의 설명에 따라)를 .*는 폭이 형식 문자열에 지정되지

을 의미하지만, 추가적인 정수 값을 인수로 포맷하는 인수 선행. '

따라서 인수로 전달할 수있는 너비의 문자열입니다.

+2

표절 혐의를 피할 수 있도록 URL 상호 참조를 추가했습니다. 물론 올바른 인용문에 "The _ width _ is not ..."보다는 "_ _ precision _이 아닙니다 ..."라고되어 있습니다. –

+0

@MattMcNabb가 지적했듯이, 해당 페이지에 대한 모든 참조는 "int * (정수 값 *)"가 정확히 "int"(또는 그것의 하위 집합)임을 강조해야합니다 -보다 직관적 인 'size_t'또는 가능한 별칭과 같은 정수 값 ,'std :: string :: size_type'과 같습니다. 참조 된 페이지가 지원되는 타입 지정자 중 하나 인'size_t '을 언급한다는 점을 감안하면 훨씬 더 혼란 스럽다. –

관련 문제