printf/scanf 패밀리의 형식 %n에 대한 실용적인 응용 프로그램이 있습니까?

StackOverflow https://stackoverflow.com/questions/353614

  •  20-08-2019
  •  | 
  •  

문제

int x;
printf("hello %n World\n", &x);
printf("%d\n", x);
도움이 되었습니까?

해결책

그렇게 유용하지 않습니다 printf(), 그러나 매우 유용 할 수 있습니다 sscanf(), 특히 여러 반복으로 문자열을 구문 분석하는 경우. fscanf() 그리고 scanf() 입력 읽기 양으로 내부 포인터를 자동으로 발전하지만 sscanf() 하지 않습니다. 예를 들어:

char stringToParse[256];
...
char *curPosInString = stringToParse;  // start parsing at the beginning
int bytesRead;
while(needsParsing())
{
    sscanf(curPosInString, "(format string)%n", ..., &bytesRead);  // check the return value here
    curPosInString += bytesRead;  // Advance read pointer
    ...
}

다른 팁

수행하는 데 사용할 수 있습니다 사악한 행위.

실용적으로 당신이 의미하는 바에 따라 다릅니다. 그것을 달성하는 다른 방법이 항상 있습니다 (예 : s [n] printf를 사용하여 문자열 버퍼로 인쇄하고 길이를 계산하십시오).

하지만

int len;
char *thing = "label of unknown length";
char *value = "value value value"
char *value2="second line of value";
printf ("%s other stuff: %n", thing, &len);
printf ("%s\n%*s, value, len, value2);

생산해야합니다

label of unknown length other stuff: value value value
                                     second line of value

(테스트되지 않았지만 나는 C 컴파일러 근처에 있지 않습니다)

이것은 사물을 정렬하는 방법으로 실용적이지만 코드에서보고 싶지는 않습니다. 더 좋은 방법이 있습니다.

상당히 난해합니다. 나중에 생성 된 문자열에서 자리 표시자를 교체 해야하는 경우 나중에 문자열의 중간에 인덱스를 기억할 수 있으므로 원래 Printf 매개 변수를 저장하거나 문자열을 구문 분석 할 필요가 없습니다.

다양한 기판의 길이를 얻는 빠른 방법으로 사용할 수 있습니다.

#include <stdio.h>
int main(int argc, char* argv[])
{
    int col10 = (10 - 1);
    int col25 = (25 - 1);

    int pos1 = 0;
    int pos2 = 0;

    printf("    5    10   15   20   25   30\n");

    printf("%s%n%*s%n%*s\n",                     "fried", 
                            &pos1, col10 - pos1, "green",   
                            &pos2, col25 - pos2, "tomatos");


    printf("    ^    ^    ^    ^    ^    ^\n");

    printf("%d %d\n", pos1, pos2);
    printf("%d %d\n", col10 - pos1, col25 - pos2);

    return 0;
}

나는 여기에 확실히 뭔가를 놓치고있다. 토마토는 오른쪽으로 너무 멀다.

VS2005 CRT 코드의 내용은 다음과 같습니다.

/* if %n is disabled, we skip an arg and print 'n' */
if ( !_get_printf_count_output() )
{
   _VALIDATE_RETURN(("'n' format specifier disabled", 0), EINVAL, -1);
   break;
}

이것을 불러 일으킨다 :

Alt Text http://www.shiny.co.il/shooshx/printfn.png

다음 줄의 경우 :

    printf ("%s other stuff: %n", thing, &len);

나는 이것이 주로 @ejames가 말하는 것을 피하는 것이라고 생각합니다.

전화해도됩니다

int _get_printf_count_output();

%N 지원이 활성화되어 있는지 확인하거나 사용합니다.

int _set_printf_count_output( int enable );

%n 형식의 지원을 활성화 또는 비활성화합니다.

MSDN vs2008에서

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