ANSI C99 yana olduğunu _Boolveya boolüzeri stdbool.h. Ancak printfbool için bir format belirleyici var mı?
Bu sözde kod gibi bir şey demek istiyorum:
bool x = true;
printf("%B\n", x);
yazdırılacak olan:
true
ANSI C99 yana olduğunu _Boolveya boolüzeri stdbool.h. Ancak printfbool için bir format belirleyici var mı?
Bu sözde kod gibi bir şey demek istiyorum:
bool x = true;
printf("%B\n", x);
yazdırılacak olan:
true
Yanıtlar:
Türler için biçim belirteci yoktur bool. Ancak, varyasyon argümanlarına aktarıldığında inttanıtıldığından daha kısa olan herhangi bir integral türü şunları kullanabilirsiniz :intprintf()%d
bool x = true;
printf("%d\n", x); // prints 1
Ama neden olmasın:
printf(x ? "true" : "false");
ya da daha iyisi:
printf("%s", x ? "true" : "false");
veya daha da iyisi:
fputs(x ? "true" : "false", stdout);
yerine?
printf("%s", x ? "true" : "false");sorunu çözer.
printf("%s", x ? "true" : "false");daha iyi tartışmaya eğilimi olacaktır printf(x ? "true" : "false");- burada biçim dizesinin tam kontrolü altındasınız, bu yüzden sorunlara neden olacak bir şey elde etme tehlikesi yoktur"%d" . fputsÖte yandan, bir daha iyi bir seçenek.
fputs" Neden daha iyi"? Her zaman C'mi geliştirmenin yollarını arıyorum. Hangi koşullar fputsyerine kullanmalıyım printf?
Bool için format belirleyici yok. Entegre türleri yazdırmak için mevcut belirteçlerden bazılarını kullanarak yazdırabilir veya daha süslü bir şey yapabilirsiniz:
printf("%s", x?"true":"false");
bool- C99 dil spec 's parçası C tipi, sadece değil C89 baskı. Yeni bir anahtar kelime var _Boolve eklerseniz <stdbool.h>, booleşanlamlıdır _Bool.
ANSI C99 / C11 için fazladan bir printf dönüşüm belirteci içermez bool.
Ancak GNU C kütüphanesi, özel tanımlayıcılar eklemek için bir API sağlar .
Bir örnek:
#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;
}
Bir glibc uzantısı olduğundan GCC bu özel belirleyici hakkında uyarır:
$ gcc -Duvar -g main.c -o ana
main.c: 'main' işlevinde:
main.c: 34: 3: uyarı: [-Wformat =] biçiminde bilinmeyen dönüşüm türü karakter 'B'
r = printf ("Sonuç:% B \ n", b);
^
main.c: 34: 3: uyarı: biçim için çok fazla argüman [-Wformat-extra-args]
Çıktı:
$ ./main Sonuç: yanlış (yazılı 21 karakter) $ ./alan 1 Sonuç: doğru (yazılı 20 karakter)
Geleneğinde itoa():
#define btoa(x) ((x)?"true":"false")
bool x = true;
printf("%s\n", btoa(x));
btoastandart olmayan JavaScript'te (Gecko ve WebKit) "binary string to base 64 string" dir, bu nedenle farklı bir ad kullanmak isteyebilirsiniz.
"true\0false"[(!x)*5]:-)
!!x*5.
C ++ 'dan C'den daha iyi isterseniz, bunu deneyebilirsiniz:
#include <ios>
#include <iostream>
bool b = IsSomethingTrue();
std::cout << std::boolalpha << b;
Az önce kullandığım boolean değerine göre 1 veya 0 yazdırmak için:
printf("%d\n", !!(42));
Özellikle Bayraklarda kullanışlıdır:
#define MY_FLAG (1 << 4)
int flags = MY_FLAG;
printf("%d\n", !!(flags & MY_FLAG));
!!
Ben bir bool sonucu 'yanlış' veya 'true' olarak yazdırmak için En iyi yolu bir cevap tercih ? , tıpkı
printf("%s\n", "false\0true"+6*x);
"false\0true"+6*xGerçekten ne yaptığını anlayabilmem biraz zamanımı aldı . Başka insanlarla bir projede veya sadece x yıl sonra anlamak istediğiniz bir kod tabanındaki bir projede çalışıyorsanız , bunun gibi yapılardan kaçınılmalıdır.
printf("%s\n","false\0true"+6*(x?1:0));...% 5 daha az okunabilir.
static inline char const *bool2str(_Bool b) { return "false\0true"+6*x; } int main(void) { printf("%s != %s", bool2str(false), bool2str(true)); return 0; } İle aynı static inline char decimal2char(int d) { assert(d >= 0 && d <= 9); return '0' + d; }; sadece tanımlayıcı olarak adlandırılmış bir işleve sarın ve okunabilirliği konusunda endişelenmeyin.