programing

bool의 printf 형식 지정자는 무엇입니까?

goodsources 2022. 8. 21. 20:01
반응형

bool의 printf 형식 지정자는 무엇입니까?

ANSI C99가 있기 때문에_Bool또는bool경유로stdbool.h하지만 여기도 있나요?printfBool의 형식 지정자를 지정하시겠습니까?

내 말은 그 의사 코드 같은 거 말이야

bool x = true;
printf("%B\n", x);

다음과 같이 출력됩니다.

true

에 대한 형식 지정자가 없습니다.bool단, 보다 짧은 일체형이기 때문에int로 승진하다int로 전해질 때printf()의 variadic 인수를 사용할 수 있습니다.%d:

bool x = true;
printf("%d\n", x); // prints 1

왜 안 돼?

printf(x ? "true" : "false");

또는 보다 나은 방법:

printf("%s", x ? "true" : "false");

또는 더 나은 방법:

fputs(x ? "true" : "false", stdout);

대신?

에 대한 형식 지정자가 없습니다.bool. 일부 기존 지정자를 사용하여 일체형 인쇄를 하거나 보다 고급스러운 작업을 수행할 수 있습니다.

printf("%s", x?"true":"false");

ANSI C99/C11 에는, 다음의 추가의 printf 변환 지정자는 포함되어 있지 않습니다.bool.

그러나 GNU C 라이브러리는 커스텀 지정자를 추가하기 위한 API를 제공합니다.

예:

#include <stdio.h>
#include <printf.h>
#include <stdbool.h>

static int bool_arginfo(const struct printf_info *info, size_t n,
    int *argtypes, int *size)
{
  if (n) {
    argtypes[0] = PA_INT;
    *size = sizeof(bool);
  }
  return 1;
}
static int bool_printf(FILE *stream, const struct printf_info *info,
    const void *const *args)
{
  bool b =  *(const bool*)(args[0]);
  int r = fputs(b ? "true" : "false", stream);
  return r == EOF ? -1 : (b ? 4 : 5);
}
static int setup_bool_specifier()
{
  int r = register_printf_specifier('B', bool_printf, bool_arginfo);
  return r;
}
int main(int argc, char **argv)
{
  int r = setup_bool_specifier();
  if (r) return 1;
  bool b = argc > 1;
  r = printf("The result is: %B\n", b);
  printf("(written %d characters)\n", r);
  return 0;
}

glibc 확장이므로 GCC는 해당 커스텀 지정자에 대해 경고합니다.

$ gcc - 벽 -g 메인.c -o 메인main.c: 함수 'main'에서:
main.c:34:3: 경고: 알 수 없는 변환 유형 문자 'B' 형식 [-Wformat=]r = printf("결과: %B\n", b);^main.c:34:3:경고: 형식 [-Wformat-extra-args]에 대한 인수가 너무 많습니다.

출력:

$./기본값결과는 false입니다.(21글자 작성)$ / 메인 1그 결과: true(20글자 작성)

의 전통에 따라itoa():

#define btoa(x) ((x)?"true":"false")

bool x = true;
printf("%s\n", btoa(x));

방금 사용한 부울 값을 기준으로 1 또는 0을 인쇄하려면:

printf("%d\n", !!(42));

특히 Flags에서 유용합니다.

#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));

할 수 없지만 0 또는 1을 인쇄할 수 있습니다.

_Bool b = 1;
printf("%d\n", b);

원천

C보다 C++ 를 더 좋아하는 경우는, 다음과 같이 시험할 수 있습니다.

#include <ios>
#include <iostream>

bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;

Bool 결과를 c?로 'false' 또는 'true'로 출력하는 Best way의 답변을 선호합니다.

printf("%s\n", "false\0true"+6*x);
  • x == 0, "false\0true"+ 0은 "false"를 의미합니다.
  • x == 1, "false\0true"+ 6"은 "true"를 의미합니다.

언급URL : https://stackoverflow.com/questions/17307275/what-is-the-printf-format-specifier-for-bool

반응형