2012-05-13 3 views
12

는이 같은 형식 문자열이 있습니다같은 변수를 문자열에 여러 번 인쇄하는 방법은 무엇입니까?

buf[] = "A%d,B%d,C%d,D%d,F%d,G%d,H%d,I%d,J%d"; 

를 나는 내가 사용하는 각 %d에 대해 동일한 정수를 삽입 할 :

int val = 6; 
sprintf(buf2, buf, val,val,val,val,val,val,val,val,val); 

내가 나를 필요로 단지 방법으로 sprintf를 사용할 수 한 번만 val이라고 쓰면 sprintf은 각 %d에 대해 사용할 것입니까?

답변

15

예, 언제든지 %1$d을 사용할 수 있습니다. 1$은 두 번째 인수를 참조합니다. 다른 인수에서도 분명히 할 수 있습니다.

데모 : 위치 지정자가 POSIX의 확장이다 http://codepad.org/xVmdJkpN

주 -이 모든 단일 컴파일러와 함께 작동되지 않을 수도 있습니다. 예를 들어 작업이 필요한 경우 Visual C++ 컴파일러에서는 인수를 반복하는 추악한 방법을 사용하거나 printf 스타일 함수를 전혀 사용하지 않는 것이 좋습니다. 또 다른 옵션은 POSIX 호환 sprintf 구현을 사용하거나 여러 호출을 사용하여 매번 루프에 하나의 숫자를 추가하는 것입니다 (형식 문자열이 동적으로 작성되어 올바른 인수 수를 지정하지 못하는 경우).


부수적으로, sprintf은 피해야합니다. 대신 snprintf(buf2, sizeof(buf2), ....)을 사용하십시오. 물론 이것은 buf2에 컴파일 타임에 알려진 정적 크기가 필요합니다. 그러나 수동으로 할당하는 경우 sizeof(buf2) 대신 길이가 포함 된 변수를 간단히 사용할 수 있습니다.

+0

이 표준은 C입니까? –

+0

당신이 처음으로 옳았습니다. 'val'이 형식 문자열의 첫 번째 인수이기 때문에 '% 1 $ d'을 사용하십시오. –

+0

sprintf를 통해 snprintf를 사용하면 어떤 이점이 있습니까? – Rhexis

5

이렇게하는 표준 (즉, 휴대 가능한) 방법은 없습니다.

+0

OP는 명시 적으로 표준화 된 방식을 요구하지 않았습니다. 요즘에는 유익한 확장 기능을 사용하지 않는 것이 좋은 이유가 있다고 생각하지 않습니다. 특히 모든 훌륭한 라이브러리를 작성하지 않으면 곧 사용하게 될 것입니다! – ThiefMaster

+0

@ ThiefMaster :하지만 그는 특정 플랫폼을 지정하지 않았습니다. 예를 들어 Visual C++에서는 POSIX 확장이 작동하지 않습니다. –

관련 문제