2017-03-23 15 views
0

scanfを使用して、指定された幅の整数を読み取る方法。それを修正する方法C++ scanf関数を使用して__int16_t整数を読み取る方法

#include <cstdio> 

using namespace std; 

int main(){ 
    __int16_t a; 
    __int32_t b; 
    scanf("%d %d", &a, &b) 
    return 0; 
} 

書式指定子「%dは」の代わりに「int型*」引数が必要であることを警告するコンパイラの__int16_tが* 'がある そう?
BTW C++ 11は許可されていません!

+0

標準的なデータ型ではないので、 '__int24_t'の書式指定子はありません。(おそらく、整数型ではかなり奇妙な幅ですが)コンパイラには特別な拡張があります。 – UnholySheep

+0

また、C++ 11 [固定幅の整数型](http://en.cppreference.com/w/cpp/types/integer) – UnholySheep

+0

'scanf'は、限られた種類のデータ型をサポートしています。サポートされているものを理解するために、[このリンク](http://en.cppreference.com/w/cpp/io/c/fscanf)の 'format'パラメータの説明を見てください。 C++の –

答えて

-5

__int16_tには '%d'を使用してください。私は '__int24_t'が存在するかどうかわからない。詳細はHow to use int16_t or int32_t with functions like scanfです。

+5

'__int16_t'に '%d'を使う' sizeof(int)== 2'の場合にのみ有効です。現代システムではまれです。さらに、これはコメントではなく、答えであるべきです(はい、私はあなたがコメントのための十分な担当者を持っていないことを知っていますが、それはあなたがハーフベークドの回答を投稿できるということを意味しません)。 –

+1

また、 '%d 'を' __int16_t'に使用しているときにOPが正確に警告を出しています – UnholySheep

2

標準std::scanfは、標準タイプのみをサポートしています。標準ライブラリで標準以外の型の使用を可能にする書式指定子が書かれていない限り、非標準型の読み込みには使用できません。そうであれば、その文書に従ってください。

最初に標準タイプにスキャンし、余分なビット(ある場合)をマスクして変換することができます。入力が意図されたターゲットタイプをオーバーフローしない場合、マスキングは不必要である。完全のために

long temp_a, temp_b; // could use short or int for temp_a 
std::scanf("%ld %ld", &temp_a, &temp_b); 
__int16_t a = temp_a & 0xffff; 
__int32_t b = temp_b & 0xffffffff; 

1は、C++ 11を使用することができれば、彼らは標準の固定幅のタイプがあります。

std::int16_t a; 
std::int32_t b; 
std::scanf("%" PRId16 "%" PRId32, &a, &b) 

それとも、あなたのストリーミングライブラリは非のためのオーバーロードがある場合-standardタイプの場合は、std::cinを使用します。そうすれば、無効な入力に対処できます。

0

__int16_tはおそらく16ビット符号付き整数(コンパイラ固有)の型です。 scanf()は、一般的にそのようなコンパイラ固有の型をサポートしていません(コンパイラとライブラリに固有の書式指定子が必要です)。

以下では、__int16_tを16ビット符号付き整数型としてサポートするコンパイラを想定しており、scanf()はそれを読み取る方法を提供していません。

long int some_int; // range at least [-2147483647,2147483647] 
__int16_t a; 
if (scanf("%ld ", &some_int) == 1) 
{ 
     // report error if some_int outside range a __int16_t can represent 

     a = some_int; 
} 
else 
{ 
     // an error occurred 
} 

C++標準のみ(より大きな範囲を可能にするにもかかわらず)32767-32767の範囲を表現することができるようにintを必要とするので、私は、上記でint%d形式指定子を使用しません。コンパイラのintは範囲-3267832767を表すことができますが、__int16_tは範囲-3276732768を表すと考えられます。このような設定では、の代わりにintを使用すると、上記のコードでは32768の入力を正しく処理できないことがあります。

個人的には、Cのscanf()の代わりにC++ istream(例:std::cin >> a)を使用することをお勧めします。実際にはおそらく動作する可能性が高いからです。その理由は、__int16_tのようなタイプをサポートしている実装の場合、それをサポートするための努力はであり、scanf()でそれをサポートしようとする努力よりも小さいからです。

+0

'%ld'の後の空白文字を削除することをお勧めします。非空白文字が入力されます。 –

関連する問題