모호성은 C 표준 자체에서 시작됩니다. C99와 C11은 모두 동일한 snprintf
기능 설명을 갖습니다 . 다음은 C99의 설명입니다.
7.19.6.5 snprintf
함수
개요
1 #include <stdio.h>
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
설명
2이 snprintf
함수는 fprintf
출력이 s
스트림이 아닌 배열 (인수로 지정됨)에 기록된다는 점을 제외하고 와 동일 합니다. 경우 n
IS는 제로, 아무것도 기록되지 않고, s
널 포인터가 될 수있다. 그렇지 않으면 n-1
st를 초과하는 출력 문자 는 배열에 기록되지 않고 버려지고 실제로 배열에 기록 된 문자의 끝에 널 문자가 기록됩니다. 겹치는 객체간에 복사가 발생하면 동작이 정의되지 않습니다.
반환
3 snprintf
함수를 작성했다되었을 것입니다 문자 수를 반환n
종료 널 문자를 계산하지 않거나 인코딩 오류가 발생한 경우 음수 값을 계산하지 않고 충분히 커야합니다. 따라서 반환 된 값이 음수가 아니고보다 작은 경우에만 null로 끝나는 출력이 완전히 기록되었습니다 n
.
한편 으로 문장
그렇지 않으면 st를 초과하는 출력 문자n-1
는 배열에 기록되지 않고 버려지고 실제로 배열에 기록 된 문자의 끝에 널 문자가 기록됩니다.
있다고
합니다 (경우 s
3 자 길이의 배열을 포인트 등) n
3, 다음 2 개 문자가 기록되고, 2 일 이상 문자가 삭제됩니다 ; 그런 다음 널 문자는 그 2 다음에 기록됩니다 (그리고 널 문자는 기록 된 세 번째 문자가됩니다) .
그리고 이것은 원래의 질문에 대한 답이라고 믿습니다.
답변 :
겹치는 개체간에 복사가 발생하면 동작이 정의되지 않습니다.
경우 n
0 아무 것도 출력에 기록되지이다
의 부호화 에러가 발생하지 않으면, 그렇지 않으면, 출력은 항상 널 종료 ( 의 여부에 관계없이 출력 배열 여부에 출력 끼워 일부 문자가 출력되도록 폐기하지 다음 경우 배열이 오버플로되지 않음)
그렇지 않으면 (인코딩 오류가 발생하는 경우) 출력 이 null로 종료되지 않은 상태로 유지 될 수 있습니다 .
반면에
마지막 문장
따라서 반환 된 값이 음이 아니고 다음보다 작은 경우에만 null로 끝나는 출력이 완전히 기록되었습니다. n
모호함을 제공 합니다 (또는 내 영어가 충분하지 않음). 나는 적어도 두 가지 방법으로이 문장을 해석 할 수 있습니다 :
1. 출력은 null로 끝나는 경우와 반환 값은 음이 아닌 및 경우에만 미만의n
반환 값이 경우 것이있는 수단 ( 하지 미만 n
, 즉 출력합니다 (를 포함하여 종료 null 문자)가 배열에 맞지 않으면 출력 이 null로 종료되지 않습니다 ).
2. 반환 된 값이 음이 아니고 보다 작은 경우에만 출력이 완료됩니다 (문자가 삭제되지 않음) .n
나는 위의 해석 1이 답변과 모순되고 오해와 긴 논의를 야기한다고 생각합니다. 이것이 snprintf
함수를 설명하는 마지막 문장이 모호함을 제거하기 위해 변경이 필요한 이유입니다 (C 언어 표준에 대한 제안서를 작성하는 근거를 제공합니다). 링크에 대한 @ "Martin Ba"덕분에 http://en.cppreference.com/w/c/io/fprintf (참조 )
에서 모호하지 않은 표현의 예를 가져올 수 있습니다 . 4)
" snprintf :이 기능의 설명을 변경하기위한 C 표준 제안 / 계획이 있습니까? " 질문도 참조하십시오 .