source

double in printf의 올바른 형식 지정자

manysource 2022. 11. 3. 21:56

double in printf의 올바른 형식 지정자

올바른 형식 지정자는 무엇입니까?doubleprintf로요?그런가요?%f아니면?%lf내 생각엔%f잘 모르겠어요.

코드샘플

#include <stdio.h>

int main()
{
   double d = 1.4;
   printf("%lf", d); // Is this wrong?
}

"%f"는 (또는 적어도1개의) 더블의 올바른 형식입니다.의 형식은 없습니다.float, 왜냐하면 당신이 통과를 시도했을 때float로.printf로 승격됩니다.double전에printf수신합니다1. "%lf"또한 현행 표준 하에서도 허용됩니다.l그 뒤에 있는 경우 효과가 없는 것으로 지정됩니다.f변환 지정자(특히).

이 장소에서는,printf형식 문자열은 와 크게 다르다scanf(그리고fscanf, 등) 포맷 문자열.출력의 경우 을 전달하고 있습니다. 이 값은 다음 값에서 승격됩니다.float로.doublevariadic 파라미터로 전달되는 경우.입력의 경우 포인터를 전달하고 있지만 승격되지 않았으므로 다음과 같이 알려야 합니다.scanf읽고 싶은지 아닌지float또는double에 대해서는scanf,%f읽고 싶다는 의미입니다.float그리고.%lf읽고 싶다는 의미입니다.double(그리고, 그 가치가 있는 것은, 잠시 동안,long double, 를 사용합니다.%Lf어느 쪽이든printf또는scanf).


1. C99, §6.5.2/6 : "호출함수를 나타내는 식에 프로토타입을 포함하지 않는 형식이 있으면 각 인수에 대해 정수 승진을 하고 유형 플로트를 갖는 인수는 2배로 승격한다.이를 디폴트 인수 프로모션이라고 합니다.C++에서는 표현은 다소 다르지만(예를 들어 "protype"이라는 단어를 사용하지 않음), 효과는 동일합니다. 즉, 모든 가변 파라미터가 함수에 의해 수신되기 전에 기본 프로모션을 수행합니다.

그럴 수 있다.%f,%g또는%e숫자 형식을 지정하는 방법에 따라 달라집니다.자세한 내용은 여기를 참조하십시오.l에 수식어가 필요합니다.scanf와 함께double, 단, 에 없습니다.printf.

C99 표준(즉 N1256 드래프트)의 경우 규칙은 fprintf(printf, sprintf, ...) 또는 scanf 함수 종류에 따라 달라집니다.

추출된 관련 부품은 다음과 같습니다.

서문

이 제2판은 ISO/IEC 9899/COR1:1994, ISO/IEC 9899/AMD1:1995 및 ISO/IEC 9899/COR2:1996에 의해 수정 및 수정된 초판 ISO/IEC 9899:1990을 취소하고 대체합니다.이전 에디션에서 크게 변경된 내용은 다음과 같습니다.

  • %lf변환 지정자가 허용됨printf

7.19.6.1fprintf기능.

7 길이 수식어와 그 의미는 다음과 같다.

l (ell) (...)이 다음의 a, A, e, E, f, F, g 또는 G 변환 지정자에 영향을 주지 않음을 지정합니다.

L 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 긴 이중 인수에 적용되도록 지정합니다.

에 대해 지정된 것과 동일한 규칙fprintf지원하다printf,sprintf및 유사한 기능을 제공합니다.

7.19.6.2fscanf기능.

11 길이 수식어와 그 의미는 다음과 같다.

l (ell) 다음 a, A, e, E, f, F, g 또는 G 변환 지정자가 타입 포인터를 2배로 하는 인수에 적용되는 것을 지정합니다.

L 다음 a, A, e, E, f, F, g, 또는 G 변환 지정자가 긴 이중 인수에 적용되도록 지정합니다.

12 변환 지정자와 그 의미는 다음과 같습니다.a, e, f, g는 옵션으로 부호화된 부동 소수점 숫자와 일치합니다. (...)

14 변환 지정자 A, E, F, G 및 X도 유효하며 각각 a, e, f, g 및 x와 동일하게 동작한다.

한마디로 말하면fprintf다음의 지정자 및 대응하는 타입이 지정됩니다.

  • %f-> 2배
  • %Lf-> 긴 더블.

및 을 위해fscanf그 이유는 다음과 같습니다.

  • %f-> 플로트
  • %lf-> 2배
  • %Lf-> 긴 더블.

포맷%lf완전히 정확하다printf을 위해 포맷하다.double사용하신 그대로입니다.코드에는 아무런 문제가 없습니다.

포맷%lfprintf는 C 언어의 오래된 버전(C99)에서는 지원되지 않았습니다.이 버전에서는 포맷 지정자 간에 피상적인 "불일관성"이 생깁니다.doubleprintf그리고.scanf그 표면적인 불일치는 C99에서 수정되었다.

를 사용할 필요가 없습니다.%lf와 함께doubleprintf를 사용할 수 있습니다.%f괜찮으시다면 (도)%lf그리고.%f등가printf). 그러나 현대 C에서는 다음과 같이 사용하는 것이 이상적입니다.%f와 함께float,%lf와 함께double그리고.%Lf와 함께long double양쪽에서 일관되게printf그리고.scanf.

%Lf(대문자에 주의해 주세요.L)는 롱 더블 포맷 지정자입니다.

플레인용doubles,어느 하나%e,%E,%f,%g또는%G할 거다.

언급URL : https://stackoverflow.com/questions/4264127/correct-format-specifier-for-double-in-printf