Sejak ANSI C99 ada _Bool
atau bool
melalui stdbool.h
. Tetapi apakah ada juga printf
penentu format untuk bool?
Maksud saya sesuatu seperti dalam kode semu itu:
bool x = true;
printf("%B\n", x);
yang akan mencetak:
true
Sejak ANSI C99 ada _Bool
atau bool
melalui stdbool.h
. Tetapi apakah ada juga printf
penentu format untuk bool?
Maksud saya sesuatu seperti dalam kode semu itu:
bool x = true;
printf("%B\n", x);
yang akan mencetak:
true
Jawaban:
Tidak ada penentu format untuk bool
jenis. Namun, karena jenis integral apa pun yang lebih pendek dari int
yang dipromosikan int
ketika diturunkan ke printf()
argumen variadik, Anda dapat menggunakan %d
:
bool x = true;
printf("%d\n", x); // prints 1
Namun mengapa tidak:
printf(x ? "true" : "false");
atau lebih baik:
printf("%s", x ? "true" : "false");
atau, bahkan lebih baik:
fputs(x ? "true" : "false", stdout);
sebagai gantinya?
printf("%s", x ? "true" : "false");
akan memperbaiki masalah ini.
printf("%s", x ? "true" : "false");
adalah lebih baik bahwa printf(x ? "true" : "false");
- Anda berada dalam keseluruhan kontrol dari format string di sini sehingga tidak ada bahaya bahwa itu akan mendapatkan sesuatu seperti "%d"
yang akan menyebabkan masalah. Di fputs
sisi lain, ini adalah pilihan yang lebih baik.
fputs
"lebih baik"? Saya selalu mencari cara untuk meningkatkan C. Saya dalam kondisi apa yang harus saya gunakan, fputs
bukan printf
?
Tidak ada penentu format untuk bool. Anda dapat mencetaknya menggunakan beberapa specifier yang ada untuk mencetak tipe integral atau melakukan sesuatu yang lebih mewah:
printf("%s", x?"true":"false");
bool
ketik C, hanya saja tidak dalam edisi C89 - bagian itu dari C99 bahasa spec. Ada kata kunci baru _Bool
, dan jika Anda sertakan <stdbool.h>
, maka bool
sinonim untuk _Bool
.
ANSI C99 / C11 tidak termasuk specifier konversi printf tambahan untuk bool
.
Tetapi pustaka GNU C menyediakan API untuk menambahkan penspesifikasi khusus .
Sebuah contoh:
#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;
}
Karena ini merupakan ekstensi glibc, GCC memperingatkan tentang specifier khusus itu:
$ gcc -Wall -g main.c -o main main.c: Dalam fungsi 'main': main.c: 34: 3: peringatan: karakter tipe konversi yang tidak dikenal 'B' dalam format [-Wformat =] r = printf ("Hasilnya adalah:% B \ n", b); ^ main.c: 34: 3: peringatan: terlalu banyak argumen untuk format [-Wformat-extra-args]
Keluaran:
$ ./main Hasilnya adalah: false (ditulis 21 karakter) $. / utama 1 Hasilnya adalah: benar (ditulis 20 karakter)
Dalam tradisi itoa()
:
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
btoa
adalah "string biner ke basis 64 string" dalam JavaScript non-standar (Gecko dan WebKit), jadi Anda mungkin ingin menggunakan nama yang berbeda.
"true\0false"[(!x)*5]
:-)
!!x*5
.
Jika Anda menyukai C ++ lebih baik daripada C, Anda dapat mencoba ini:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
Saya lebih suka jawaban dari Cara terbaik untuk mencetak hasil bool sebagai 'salah' atau 'benar' dalam c? , seperti
printf("%s\n", "false\0true"+6*x);
"false\0true"+6*x
sebenarnya terjadi. Jika Anda bekerja dalam proyek dengan orang lain, atau hanya dalam proyek dengan basis kode yang ingin Anda pahami x tahun kemudian, konstruksi seperti ini harus dihindari.
printf("%s\n","false\0true"+6*(x?1:0));
yang hanya ... 5% lebih sedikit dapat dibaca.
static inline char const *bool2str(_Bool b) { return "false\0true"+6*x; } int main(void) { printf("%s != %s", bool2str(false), bool2str(true)); return 0; }
Sama seperti dengan static inline char decimal2char(int d) { assert(d >= 0 && d <= 9); return '0' + d; }
; cukup bungkus dengan fungsi yang dinamai secara deskriptif dan jangan khawatir tentang keterbacaannya.