C에서 % n 형식 지정 튼 사용하는 것은 무엇입니까?
%n
C 에서 형식 지정 튼 사용하는 것은 무엇입니까? 누구든지 예를 들어 설명 할 수 있습니까?
인쇄 된 것이 없습니다. 인수는 지금까지 상관 문자 수가 저장되는 부호있는 곳에 대한 집집합니다.
#include <stdio.h>
int main()
{
int val;
printf("blah %n blah\n", &val);
printf("val = %d\n", val);
return 0;
}
이전 코드는 다음과 같이 인쇄됩니다.
blah blah
val = 5
답변의 대부분 이러한은 무엇인지 설명 %n
하지 않습니다 (인쇄하지하는 아무것도과에 지금까지 인쇄 된 문자의 수를 쓰고있는 int
변수), 지금까지 아무도 그러나 정말 무엇의 예를 주신 사용 이 가지고 있습니다. 여기 하나가 있습니다.
int n;
printf("%s: %nFoo\n", "hello", &n);
printf("%*sBar\n", n, "");
인쇄합니다 :
hello: Foo
Bar
Foo와 Bar가 정렬되어 있습니다. ( %n
이 특정 예 를 사용하지 않고 그렇게하는 것은 사소한 일이며 일반적으로 항상 첫 번째 printf
전화를 사용할 수 있습니다 .
int n = printf("%s: ", "hello");
printf("Foo\n");
printf("%*sBar\n", n, "");
약간의 추가 된 편의성 (비록 %n
오류를 유발할 수있는)을 사용하는 것이 가치가 있는지 여부는 논쟁의 여지가 있습니다.)
실제 실제로 %n
지정자가 많이 사용되는 것을 보지는 못했지만 형식 문자열 공격 과 함께 oldschool의 printf에서 취약점 꽤 오래 전에 사용되었다는 것을 기억합니다 .
이런 식으로 뭔가
void authorizeUser( char * username, char * password){
...code here setting authorized to false...
printf(username);
if ( authorized ) {
giveControl(username);
}
}
악의적 인 사용자가 사용자 이름 매개 변수 변수를 printf로 형식 전달로 전달하고 %d
, %c
또는 w / e 조합을 사용 하여 호출 스택을 통과 한 다음 true 값으로 승인 된 변수를 사용할 수 있습니다.
그래, 난해한 사용이지만 보안 허점을 피하기 위해 데몬을 사용할 때 항상 아는 것이 유용합니다? : 디
여기 에서 지금까지 인쇄 된 문자 수를 저장하는 것을 볼 수 있습니다.
n
인수는fprintf()
함수 중 하나에 대한이 호출에 의해 지금까지 출력 정수에 대한 포인터 입니다. 인수가 변환되지 않습니다.
사용 예는 다음과 가변합니다.
int n_chars = 0;
printf("Hello, World%n", &n_chars);
n_chars
그러면 값이입니다 12
.
% n과 관련된 인수는 int *로 취급 인수 printf의 해당 시점에 인쇄 된 총 문자 수로 채워집니다.
지금까지 모든 대답은 그에 대한 %n
것이지만, 처음에 누군가가 그것을 원하는 이유는 아닙니다. 저장된 값이 결과 문자열에 대한 배열 인덱스이기 때문에 나중에 결과 문자열을 분리하거나 수정해야 할 때 sprintf
/ snprintf
를 사용하면 다소 유용 합니다. 그러나이 응용 프로그램은를 사용하면 훨씬 더 유용합니다. sscanf
특히 scanf
패밀리의 함수는 처리 된 문자 수를 반환하지 않고 필드 수를 반환하기 때문입니다.
또 다른 정말 hackish 사용은 다른 작업의 일부로 숫자를 인쇄하는 동안 동시에 무료로 pseudo-log10을 얻는 것입니다.
다른 날 나는 %n
내 문제를 멋지게 해결할 수 있는 상황에 처했다. 이전 답변 과 달리이 경우 좋은 대안을 고안 할 수 없습니다.
지정된 텍스트를 표시하는 GUI 컨트롤이 있습니다. 이 컨트롤은 해당 텍스트의 일부를 굵게 (또는 기울임 꼴 또는 밑줄 등) 표시 할 수 있으며 시작 및 끝 문자 색인을 지정하여 어느 부분을 지정할 수 있습니다.
제 경우에는를 사용하여 컨트롤에 대한 텍스트를 생성하고 snprintf
있으며 대체 항목 중 하나를 굵게 표시하고 싶습니다. 이 대체에 대한 시작 및 끝 인덱스를 찾는 것은 다음과 같은 이유로 중요하지 않습니다.
문자열은 여러 개의 대체를 포함하고 대체 중 하나는 임의의 사용자 지정 텍스트입니다. 이것은 내가 관심있는 대체물에 대한 텍스트 검색을 수행하는 것이 잠재적으로 모호하다는 것을 의미합니다.
형식 문자열은 지역화 될 수 있으며
$
위치 형식 지정자에 POSIX 확장을 사용할 수 있습니다 . 따라서 형식 지정자 자체에 대한 원래 형식 문자열을 검색하는 것은 간단하지 않습니다.지역화 측면은 또한 형식 문자열을
snprintf
.
따라서 특정 대체에 대한 인덱스를 찾는 가장 간단한 방법은 다음과 같습니다.
char buf[256];
int start;
int end;
snprintf(buf, sizeof buf,
"blah blah %s %f yada yada %n%s%n yakety yak",
someUserSpecifiedString,
someFloat,
&start, boldString, &end);
control->set_text(buf);
control->set_bold(start, end);
아무것도 인쇄하지 않습니다. %n
형식 문자열에 표시 되기 전에 인쇄 된 문자 수를 파악 하고 제공된 int에 출력하는 데 사용됩니다.
#include <stdio.h>
int main(int argc, char* argv[])
{
int resultOfNSpecifier = 0;
_set_printf_count_output(1); /* Required in visual studio */
printf("Some format string%n\n", &resultOfNSpecifier);
printf("Count of chars before the %%n: %d\n", resultOfNSpecifier);
return 0;
}
(에 대한 문서_set_printf_count_output
)
해당 printf()
기능에 지금까지 인쇄 된 문자 수 값을 저장 합니다.
예:
int a;
printf("Hello World %n \n", &a);
printf("Characters printed so far = %d",a);
이 프로그램의 출력은 다음과 같습니다.
Hello World
Characters printed so far = 12
% n은 C99이며 VC ++에서는 작동하지 않습니다.
참고 URL : https://stackoverflow.com/questions/3401156/what-is-the-use-of-the-n-format-specifier-in-c
'IT' 카테고리의 다른 글
URL을 공유로 변환 한 후 다시 변환 (0) | 2020.07.21 |
---|---|
Java에서 시간 소인을 밀리 초 단위의 클래스 형식 시간으로 변환 (0) | 2020.07.21 |
Mysql“show processlist”의 모든 프로세스를 어떻게 종료합니까? (0) | 2020.07.21 |
Android에서 소수 자릿수 제한 (0) | 2020.07.21 |
패턴에 대한 파일 텍스트를 검색하고 주어진 값으로 바꾸는 방법 (0) | 2020.07.21 |