web-dev-qa-db-ja.com

Boolのprintfフォーマット指定子は何ですか?

ANSI C99以降、_Boolを介したstdbool.hまたはboolがあります。しかし、bool用のprintfフォーマット指定子もありますか?

私はその擬似コードのようなものを意味します:

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

これは印刷されます:

true
363
maxschlepzig

ありません。しかし、intより短い整数型はprintf()sの可変引数に渡されるとintに昇格されるので、%dを使うことができます。

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

しかし、そうではありません

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

以上

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

あるいはもっと良い

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

代わりに?

575
user529758

Boolにはフォーマット指定子がありません。整数型を印刷するための既存の指定子のいくつかを使ってそれを印刷することができます。

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

ANSI C99/C11には、bool用の追加のprintf変換指定子は含まれていません。

しかし 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 main.c  -  o main 
 main.c:関数 'main'内:
 main.c:34:3:警告:変換タイプが不明です[-Wformat =] 
 r = printf( "結果は%B\n"、b); 
 ^ 
 main.c:34 :3:警告:formatには引数が多すぎます[-Wformat-extra-args] 

出力:

 $ ./main
結果は、次のとおりです。false 
(21文字の文字で書かれた) (20文字の表記)
27
maxschlepzig

itoa()の伝統では:

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

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

できませんが、0または1を印刷できます。

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

ソース

3
Stephan

cからboolの結果を 'false'または 'true'として出力する最良の方法は? 、ちょうど同じ

printf("%s\n", "false\0true"+6*x);
  • x == 0、 "false\0true" + 0 "それは" false "を意味します。
  • x == 1、 "false\0true" + 6 "それは" true "を意味します。
1
xjzhou

先ほど使用したブール値に基づいて1または0を出力するだけです。

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

Flagsで特に役に立ちます:

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

CよりC++が好きなら、これを試すことができます。

#include <ios>
#include <iostream>

bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
0
Arsen Y.M.