찾다

 >  Q&A  >  본문

linux - snprintf를 사용하여 원본 콘텐츠와 일부 새 콘텐츠를 배열로 인쇄하는 방법은 무엇입니까?

snprintf이 함수에는 지정된 길이가 필요하며 컴파일러는 범위를 벗어난 검사를 수행하므로 대상 길이가 모든 매개변수의 합보다 긴지 확인해야 합니다. 그러나 다음 절차를 고려하십시오.

으아악

이 프로그램을 열면-Wall 오류가 보고됩니다:

으아악

이러한 오류는 실제로 선을 넘을 가능성이 있기 때문에 예상되는 오류입니다. 문제는 오류를 보고하지 않고 어떻게 동일한 기능을 완료할 수 있느냐는 것입니다.

Mygcc版本比较新,7.1.1, 이전 버전의 컴파일러는 이 오류를 보고하지 않을 것으로 예상됩니다.

仅有的幸福仅有的幸福2737일 전854

모든 응답(1)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-05-27 17:46:46

    먼저snprintf()的第二个参数代表的是缓冲区的大小,在这里应该是LENGTHsizeof(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 calling sprintf(), snprintf(), vsprintf(), and vsnprintf(). Depending on the version of gcc(1)에 추가합니다. 그러나 표준에서는 sprintf(),

    , vsprintf()를 호출할 때 소스 및 대상 버퍼가 겹치면 결과가 정의되지 않는다고 명시적으로 명시합니다. 및 vsnprintf(). 사용된 gcc(1) 버전과 사용된 컴파일러 옵션에 따라 위와 같은 호출은 예상한 결과를 생성하지 않습니다.

    printf()즉, 원본 버퍼와 대상 버퍼가 겹치는 경우 이러한

    계열 함수의 실행 결과는 정의되지 않습니다.

    snprintf()그렇다면 "원본 콘텐츠와 일부 새 콘텐츠를 배열로 인쇄"하려면 어떻게 해야 할까요? 한 가지 방법은

    에 전달된 버퍼를 배열의 문자열 끝으로 설정하는 것입니다.

    으아악 printf()그럼 버퍼 끝에 데이터를 연속적으로 추가하려면 어떻게 해야 할까요?

    함수 계열의 반환 값은 인쇄된 문자 수(인쇄된 문자 수)이므로 다음과 같이 호출할 수 있습니다.

    으아악

    결과는 🎜 으아악

    회신하다
    0
  • 취소회신하다