2017-03-23 101 views
0

使用scanf讀取指定寬度的整數。C++如何讀取__int16_t整數使用scanf函數

#include <cstdio> 

using namespace std; 

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

有一個編譯器警告格式說明「%d」,需要「詮釋*」 ARG而不是「__int16_t *」 所以如何解決呢?
BTW C++ 11是不允許的!

+0

沒有'__int24_t'的格式說明符,因爲這不是標準的數據類型 - 也許你的編譯器有一些特殊的擴展名(雖然它對整數類型來說是一個非常奇怪的寬度) – UnholySheep

+0

你也應該更喜歡使用C++ 11 [固定寬度整數類型](http://en.cppreference.com/w/cpp/types/整數) – UnholySheep

+0

'scanf'支持一組有限的數據類型。查看[此鏈接](http://en.cppreference.com/w/cpp/io/c/fscanf)中的'format'參數描述,以熟悉受支持的內容。 C++中的 –

回答

-5

將'%d'用於__int16_t。我不知道'__int24_t'是否存在。更多這裏:How to use int16_t or int32_t with functions like scanf

+5

'使用'%d'代替__int16_t'只有在現在的系統上很少遇到'sizeof(int)== 2'的情況,此外,這應該是一個評論,而不是回答(是的,我知道你沒有足夠的評論代表,但這並不意味着,你可以張貼不完整的答案)。 –

+1

另外,OP在使用'%d'代替'__int16_t'時提出了一個警告 – 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; 

爲了完整起見,如果可以使用C++ 11,它們具有標準的固定寬度類型:

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

或者,如果您的流媒體庫中有不超載 - 標準類型,請使用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 
} 

我不使用int和在上述的%d格式說明,因爲C++標準只要求一個int以能夠表示的-3276732767(儘管允許更大的範圍)。可以想象,編譯器的int可以代表範圍-3267832767,但__int16_t代表範圍-3276732768。在這種設置下,如果使用int而不是long int,上述代碼可能無法正確處理32768的輸入。個人而言,我可能會嘗試使用C++ istream(例如std::cin >> a)而不是C的scanf(),因爲實際上它很可能有效。原因是,如果支持__int16_t這類類型的實現,那麼在istream中包含支持的努力比在scanf()中支持它的努力要少。

+0

我建議刪除'%ld'後面的空格,因爲它會丟棄空白字符_直到第一個非空白字符_並且會阻塞輸入直到另外輸入非空白字符。 –