문제

누구든지 소스 코드 파일이나 C에서 Sprintf ()의 양호하고 재사용 가능한 구현을 가진 패키지를 내 자신의 필요에 따라 사용자 정의 할 수 있습니까?

필요한 이유에 대한 설명 : 문자열은 내 코드에서 종료되지 않습니다 (이진 호환). 따라서 sprintf ( "%s")는 문자열 렌더링 방법을 이해하기 위해 코드를 수정하지 않는 한 쓸모가 없습니다.

Quinmars 덕분에 NULL이 끝나지 않고 %S를 통해 문자열을 인쇄하는 방법이 있음을 지적했습니다. 지금은 시판을 해결하지만 결국 변형을 사용하는 더 높은 레벨 기능에 대한 Sprintf (또는 SNPrintf) 구현이 필요합니다. 지금까지 언급 된 다른 중에서, SQLITE 구현이 최고인 것 같습니다. Doug Currie를 지적 해 주셔서 감사합니다.

도움이 되었습니까?

해결책

여기에 컴파일러가 없지만 Man Page를 읽는 것은 '%s'에 대한 정밀도를 전달할 수있는 것처럼 보입니다.

... 정밀도가 주어지면 널 문자가 없을 필요가 없습니다. 정밀도가 지정되지 않았거나 배열의 크기보다 큰 경우 배열에는 종단 NUL 문자가 포함되어야합니다.

그래서 당신은 그런 일을하려고 했습니까?

snprintf(buffer, sizeof(buffer), "%.*s", bstring_len, bstring);

말했듯이 나는 그것을 테스트하지 않았으며, 그것이 작동하면, 그것은 당신이 문자열 안에 ' 0'-byte가없는 경우에만 작동합니다.

편집하다: 나는 지금 그것을 테스트했고 그것은 작동합니다!

다른 팁

실제로 SNPRINTF (Sprintf 출력 버퍼 크기에 대한 Sprintf)를 찾고 있어야합니다. Google이 제안합니다 http://www.ijs.si/software/snprintf/.

SQLITE의 일부로 멋진 공개 도메인 구현이 있습니다. 여기.

나는 당신이 sqlite 버전에 포함 된 snprintf를 원한다는 Dickon Reed와 동의합니다.

나는 사용했다 이것 남자 소스 코드. 작고 이해하기 쉽고 수정하기 쉽습니다 (Glib & Libc와는 반대로).

이 링크에 따르면 http://www.programmingforums.org/thread12049.html :

전체 GCC 분포가있는 경우 C 라이브러리 (Glib 또는 Libc)의 소스는 타기에 오는 하위 디렉토리 중 하나입니다.

그래서 당신은 그것을 거기에서 볼 수 있습니다. 그것이 얼마나 도움이 될지 모르겠습니다 ...

내가 sprintf를 수정하기 위해 생각할 수있는 유일한 이유는 그것을 확장하는 것입니다. 그리고 그것을 확장하는 유일한 이유는 당신이 일종의 파서를 쓰는 길에있을 때입니다.

코딩 언어, XML 또는 실제로 구문이있는 것과 같은 구문 분석기를 만들려면 Lexers 및 Parser Generator를 살펴 보는 것이 좋습니다 (가장 일반적으로 사용되는 2 개는 다음과 같습니다. 몸을 풀다 그리고 바이슨))는 파서에 대한 매우 복잡한 코드를 거의 쓸 수 있습니다 (도구 자체는 다소 복잡하지만).

그렇지 않으면 Visual Studio에 포함 된 소스 파일에서 코드를 찾을 수 있습니다 (적어도 2005 년과 2008 년, 다른 것들은 그것을 가질 수 있지만 그 2 명은 확실히 그렇습니다).

glibc의 snprintf는 후크/핸들러 메커니즘을 통해 사용자 정의 할 수 있습니다.

그냥 아이디어 ... 예 :

#include <stdio.h>
#include <string.h>
#include <stdarg.h>

int sprintf(char * str, const char * format, ... )    
{// Here you can redfine your input before continuing to compy with standard inputs
    va_list args;
    va_start(args, format);
    vsprintf(str,format, args);// This still uses standaes formating
    va_end(args);
    return 0;// Before return you can redefine it back if you want...
}
int main (void)
{
    char h[20];
    sprintf(h,"hei %d ",10);
    printf("t %s\n",h);
    getchar();
    return 0;
}

핸슨을보세요 C 인터페이스 : 구현 및 기술. 그것은 Knuth 's를 사용하여 쓰여진다는 점에서 흥미로운 책입니다. 문맹 프로그래밍 기술 및 특별히 확장 가능한 형식의 I/O 인터페이스를 포함합니다. snprintf().

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top