snprintf
이 함수에는 지정된 길이가 필요하며 컴파일러는 범위를 벗어난 검사를 수행하므로 대상 길이가 모든 매개변수의 합보다 긴지 확인해야 합니다. 그러나 다음 절차를 고려하십시오.
이 프로그램을 열면-Wall
오류가 보고됩니다:
이러한 오류는 실제로 선을 넘을 가능성이 있기 때문에 예상되는 오류입니다. 문제는 오류를 보고하지 않고 어떻게 동일한 기능을 완료할 수 있느냐는 것입니다.
Mygcc
版本比较新,7.1.1
, 이전 버전의 컴파일러는 이 오류를 보고하지 않을 것으로 예상됩니다.
PHP中文网2017-05-27 17:46:46
먼저snprintf()
的第二个参数代表的是缓冲区的大小,在这里应该是LENGTH
,sizeof(LENGTH)
的值是4
(我猜你想写的应该是sizeof(cache)
吧)。那么,改成snprintf(cache, LENGTH, "%s/ruaruarua", cache);
이 정도면 충분할까요? 다음 예를 살펴보겠습니다.
이 예에서는 buf
끝에 문자열을 추가하려고 시도합니다. 출력을 살펴보세요
원하는 결과를 얻지 못했습니다. 왜 이런가요? snprintf()
의 매뉴얼에는 다음 단락이 있습니다:
일부 프로그램은 다음과 같은 코드에 무분별하게 의존합니다
으아악텍스트를
,buf
. However, the standards explicitly note that the results are undefined if source and destination buffers overlap when callingsprintf()
,snprintf()
,vsprintf()
, andvsnprintf()
. Depending on the version ofgcc(1)
에 추가합니다. 그러나 표준에서는sprintf()
,vsprintf()
를 호출할 때 소스 및 대상 버퍼가 겹치면 결과가 정의되지 않는다고 명시적으로 명시합니다. 및vsnprintf()
. 사용된gcc(1)
버전과 사용된 컴파일러 옵션에 따라 위와 같은 호출은 예상한 결과를 생성하지 않습니다.계열 함수의 실행 결과는 정의되지 않습니다.
printf()
즉, 원본 버퍼와 대상 버퍼가 겹치는 경우 이러한
snprintf()
그렇다면 "원본 콘텐츠와 일부 새 콘텐츠를 배열로 인쇄"하려면 어떻게 해야 할까요? 한 가지 방법은
으아악
printf()
그럼 버퍼 끝에 데이터를 연속적으로 추가하려면 어떻게 해야 할까요?
으아악
결과는 🎜 으아악