반응형
bool의 printf 형식 지정자는 무엇입니까?
ANSI C99가 있기 때문에_Bool
또는bool
경유로stdbool.h
하지만 여기도 있나요?printf
Bool의 형식 지정자를 지정하시겠습니까?
내 말은 그 의사 코드 같은 거 말이야
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
반응형
'programing' 카테고리의 다른 글
자바에서 부호 없는 바이트를 만들 수 있나요? (0) | 2022.08.21 |
---|---|
Vuejs Ajax 콜 및 데이터 테이블 (0) | 2022.08.21 |
스캐너와버퍼리더 (0) | 2022.08.21 |
Vuex 액션을 적절하게 체인하여 콜 간에 상태를 올바르게 변환하려면 어떻게 해야 합니까? (0) | 2022.08.21 |
Vue 사용에 대한 v-의 알 수 없는 속성 (0) | 2022.08.21 |