2012-10-01 5 views
-5

C 언어의 경우 다음 프로그램 중 % 5 %%, 이지만 어떻게 처리 할 수 ​​있습니까?C printf 형식 문자열

printf("%6%5%%%78%"); 
+5

어떻게 해야할지 모르겠다. –

+3

내가 틀릴 수도 있지만'printf'에 대한 유효한 형식 문자열처럼 보이지 않습니다 ... 그리고 C99 §7.19.6.1 ¶9에서 "변환 지정이 유효하지 않은 경우 동작은 정의되지 않았습니다." . –

+0

@AxelIsouard 그는 아마 '왜 그런지 모르겠다'는 의미였습니다. – Dan

답변

6

이것은 정의되지 않은 동작이며 컴파일러/플랫폼에 따라 다릅니다. 잘못된 인수를 가진 Printf 함수는 스택에서 변수를 추출하기 시작할 것이고 아무 일도 일어나지 않을 것입니다. 컴파일러는 일반적으로이

source.c:5:5: warning: conversion lacks type at end of format [-Wformat] 
source.c:5:5: warning: conversion lacks type at end of format [-Wformat] 
source.c:5:5: warning: conversion lacks type at end of format [-Wformat] 
source.c:5:5: warning: spurious trailing '%' in format [-Wformat] 
+0

에 대해 "% 6 %"가 아닌 "%%"로 표시되어야합니다.하지만이 구문은 Dev 컴파일러에서 실행됩니다. 성공적으로 실행 중입니다. 그리고 나는이 질문을 시험에서 얻었고 시험 후에도 질문을했습니다. –

+4

@AsdAsd : "무엇이든 일어날 수 있고 프로그램이 잘못되었습니다"와 "컴파일됩니다"간에 모순이 없습니다. 걸릴 때까지 생각해보십시오. 이것은 * 정말로 * 중요한 포인트입니다. –

+2

@Asd : * 확인을 실행하는 것으로 * 표시되기 때문에 올바른 것으로 의미하지는 않습니다. 또한 이런 종류의 문제를 시험 문제로 삼으려면 더 나은 학교의 과정으로 전환하는 것을 고려해야합니다. –

3

PRINTF 형식 문자열에 대해 불평 할 이유

명확하게 여기 수행되지 않습니다 인수의 동일한 수에 따라해야한다. 형식 문자열을 printf 함수

가능한 매개 변수는 다음과 같습니다

지정은
%[flags][width][.precision][length]specifier 

문자열, 기타 선택 사항 문자 등 에 대한 C 합니다.

플래그는 왼쪽 또는 오른쪽 자리 맞추기 중 +, -, 0 등 중 하나이며 아무 것도 질문에 전달되지 않습니다.

정밀도 앞에.가 붙습니다.이 예제의 경우에는 밖으로 나옵니다.

printf("%6%5%%%78%"); 
  • 에서

    살펴 보자 이제 % 후의 첫번째 인자 즉 필드 (6)의 폭으로 간주되고, 따라서 인쇄 아니다. 그러나, 후자 대신에 이라는 후자를 기대합니다. 스탠다드에 % 다음에 %가 나와서 표준 출력에 을 출력합니다. 따라서 먼저 %가 인쇄됩니다. 이제 %의 효과가 손실되어 이므로 5가 처리되어 일반 숫자로 인쇄됩니다.

  • 그런 다음 %%가 단일 %를 인쇄합니다. 다음은 다시 하나의 %이고 그 다음에 78이 나오는데, 너비가 예상되어 인쇄되지 않습니다. 그러나 후자의 다른 %는 78의 효과를 무효화하고 단일 %를 인쇄합니다. 여기에 평가 위의 유효성을 검사하려면

위를 준수 % 4를 % 2를 인쇄하는 테스트 문자열

printf("%6%4%3%2"); 

입니다. 자세한 참조 가능성이 여기에 무슨 일이 있었는지 printf

0

에 대한

은 다음과 같습니다

  • 의 printf 구현은 "%의 (d)와 같은 유효한 변환 사양의 시작이 될 수있다"% 6 ",보고 ".
  • 그러면 "%"가 표시되고 더 이상 유효한 변환 지정이 될 수 없습니다. 이 시점에서 문자열은 C 표준과 일치하지 않습니다 (예 : C 1999 7.19.6.1 8은 "완전한 변환 명세는 %%이어야한다"라고 말하며 구현은 무엇이든 할 수있다. 이 특정 구현은 "6"을 무시하고 변환 지정이 "% 6 %"대신 "%%"인 것처럼 보입니다. 따라서 표준 출력에 "%"를 씁니다.
  • 그런 다음 printf 구현은 "5"를보고 "5"를 씁니다.
  • 그런 다음 "%"가 쓰여지는 유효한 변환 명세 인 "%%"을 봅니다.
  • 그런 다음 "% 78 %"이 표시됩니다. "% 6 %"와 마찬가지로 "% 78"이 ​​(가) 유효한 사양을 시작할 수 있지만 두 번째 "%"는 잘못되었습니다. 다시 한번, 구현은 "78"을 무시하고 "%"를 씁니다.

다른 C 구현에서는 동작이 달라집니다. 이 프로그램은 부적절하다. 그것은 C 표준을 따르지 않으며, 그 동작은 C 표준에 의해 규정되지 않는다.