2016-09-23 29 views
9

次の例では、booleanの変数の値をスキャンしようとしています。私はGCCでコンパイルすると、私は警告以下の取得、Cのboolの書式指定子はありますか?

warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘_Bool *’ [-Wformat=] 
    scanf("%d",&b); 

コード:

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

int main() 
{ 
     bool b; 

     scanf("%d",&b); 
     printf("%d\n",b); 
} 

私の質問は、ブール値のいずれかの書式指定子がCにありますか? printfについてはC.

boolタイプには書式指定子がありません

+3

。代わりに、 'printf("%s \ n "、b?" true ":" false ");'を使用することもできます。 –

+0

これは印刷に関するものであり、http://stackoverflow.com/questions/12920694/format-specifier-in-scanf-for-bool-datatype-in​​-cは 'scanf()に関するものなので、これは100%dupeではありません。 '。しかし、まだ、十分に私は推測する。 :) – unwind

+0

@unwind:あなたは正しい。私は謝罪して再開する。今度はCの標準を掘り下げる時です。 – Bathsheba

答えて

3

、あなたはintに暗黙のプロモーションに依存し、指定されたフォーマッタとして%d使用することができます。

scanfについては、intに読み込んで適切に変換する必要があります。再度、%dを使用します。

-3

boolにはCには指定がありません。 警告を避けるには、printf()に型キャストする必要があります。

ただし、boolを表す専用の書式指定子はありません。

scanf()警告を回避するには、以下試してください:1ありません

scanf("%d",(int*)&b) 
+0

'bool'は必ず' int'と同じサイズですか?さもなければ、 '(int *)&b'は私には危険です。 –

+0

これは必須ではありませんが、一般的なbool(毎回ではありません)のサイズは1バイトです。これは警告のみです。 – Stubborn

+1

しかし、 'scanf'はintサイズの値をその場所に格納するので、動作は未定義です。 –

関連する問題