2014-12-11 2 views
0

나는 최종 단계로 인쇄되도록 서식이 지정된 문자열을 점진적으로 작성해야하는 프로그램을 작성 중입니다. 문자열에는 문자열이 형성되는 동안 수집되는 숫자가 포함됩니다. 따라서 출력 문자열에 형식화 된 문자열 조각을 추가해야합니다.sprintf()를 사용하여 형식화 된 문자열을 연결하는 것이 안전합니까?

하나 똑바로 앞으로 방법은 this answer에서 보여준 것처럼 다음, strcat()을 사용하여 출력 문자열로 연결된하는 포맷 단편을 포함 임시 문자열로 sprintf()을 사용하는 것입니다.

더 복잡한 방법은 새 조각을 추가 할 때 sprintf()을 현재 출력 문자열의 끝으로 가리키는 것입니다. 이것은 here입니다.

복사가 중복 문자열 사이에 발생하는 경우는, 동작이 정의되지 않은 입니다 :

MSVC sprintf_s() function (및 sprintf()의 다른 변형)에 대한 도움말 페이지 상태.

이제 기술적 출력 문자열의 끝에 단편을 연결하는 sprintf()을 이용하여 상기 제 1 스트링의 일부로 간주된다 착신 NULL을 덮어 의미한다. 따라서이 동작은 겹치는 문자열 범주에 해당됩니다. 이 기술은 잘 작동하는 것처럼 보이지만 실제로 안전합니까? 이 질문에

+1

일부 동작이 정의되지 않았다고 말하면 해당 동작에 대해 아무 것도 가정 할 수 없습니다. 오늘은 효과가있을 수 있지만 내일에는 행동이 예고없이 변경됩니다. –

답변

1

방법은 당신이에 연결 :

strcat() for formatted strings

문자열 문제를 중복에 대한 안전하지만, 물론 그것은 snprintf보다는 sprintf를 사용하여 무제한의 쓰기를 수행하는 사용자들은 안전하지 않은입니다.

안전하지, 어떤 문자열을 중복에 대한 텍스트, 참조되는 것은 같은 것입니다 무엇

: 입력과 출력으로 모두 사용되는 buf의 범위를 중복, 여기

snprintf(buf, sizeof buf, "%s%s", buf, tail); 

를하고이 결과 정의되지 않은 동작입니다. 하지 마.

+0

감사합니다. 그래서'sprintf()'메소드를 변형 한 upvoted 답변을위한 몇 가지 예가 있습니다. 반대 의견도 없었습니다. 그러므로 내 질문. 그래서,이 방법은 결국 안전하지 않으므로 피해야한다고 제안하고 있습니까? (특정 구현에서 작동하지만, 이식성이없는 것으로 간주되는 경우)? 그렇다면 다른 답변에 대해 논평 할 가치가 있습니다. – ysap

+0

답변을 다시 읽었습니다. 그래서, 기본적으로'sizeof' 연산자를 사용하는 것과 다른 점을 제외하고는 같은 방법에 대해 이야기합니다. * 평가 순서 *가 정의되지 않았기 때문입니까? – ysap

+0

그건 사실입니다. 그렇다면 MSDN의 인용문이 겹치는 문자열을 금지하는 첫 번째 양식이 안전한 것으로 간주되는 이유는 무엇입니까? – ysap