2015-12-17 71 views
1

如果存在任何可能發生溢出錯誤的情況,將大整數類型轉換爲較小的符號通常不是一個好主意嗎?餘物通過這個代碼在C++引物(17.5.2),這表明低級別IO操作驚訝:將int從int轉換爲char,其中涉及溢出錯誤

int ch; 

while((ch = cin.get()) != EOF) 
    cout.put(ch); //overflow could occur here 

鑑於

  • cin.get()將其轉換獲得要unsigned char字符,和然後到int。因此ch將在0-255範圍內(不包括EOF)。一切都很好。
  • 但是然後在put(ch)表達式ch被轉換回char。如果charsigned那麼從128-255開始ch的任何值都會導致溢出,當然?

請問這樣的代碼是一般不好的做法,如果我期待普通輸入0-127之外的東西,因爲我們不能保證溢出如何治療?

+3

'cin.get'保證如果返回值不是'EOF',那麼它可以表示爲'unsigned char'。 –

+0

@KerrekSB我以爲這就是我所說的。也許我應該更清楚一點,我關心的是'cout.put(ch)'聲明。 – SergeantPenguin

+0

啊,是的。通常,所有的IO函數都把'char'值從'unsigned char'轉換,所以這很好。請注意,轉換是*未指定*而不是「溢出」。 –

回答

0

使用itoa,如果你想將整數轉換爲一個以null結尾的字符串來代表它。

char * itoa (int value, char * str, int base); 

,或者你可以將其轉換爲字符串,然後字符:

std::string tostr (int x){ 
    std::stringstream str; 
    str << x; 
    return str.str();} 

將字符串轉換成char

string fname; 
char *lname; 
lname = new char[fname.lenght() + 1]; 
strcpy(f, lname.c_str()); 

,如果你看到的 「安全錯誤」 使用#pragma

禁用