2016-09-06 95 views
3

當編寫解決一個難題一個程序,我碰到下面的代碼片段警告:警告C4244 '=':從'int'轉換爲'char',可能會丟失數據?

std::string str = "hello"; 

for (int i = 0; i < str.length(); ++i) 
    str[i] = toupper(str[i]); //make every letter capital  
// ^^ warning 

我得到上面的最後一行警告。

警告C4244 \'=':從'int'轉換爲'char',可能會丟失數據?

有什麼辦法擺脫這種警告?

+6

你需要**閱讀文檔**爲'toupper'理解爲什麼它返回'int'這樣就可以決定什麼,如果有的話,做一下這個警告。 **有一個返回類型的原因,並且在不知道發生了什麼事情的情況下快速轉換爲char類型將是一個嚴重的錯誤。 –

+3

注:我將你的代碼縮減爲[mcve]。爲什麼?那麼,你正在做一個迴文項目的事實與警告沒有任何關係。此外,不需要介紹:) **總是儘量讓你的問題儘可能短,但不要太短,即不要留下任何東西!** – Rakete1111

+1

@ Rakete1111:本來是一個MCVE的包含和一個'main',但是否則很好! –

回答

2

明確其轉換爲char

str[i] = (char)toupper(str[i]); 

toupper()被定義爲返回一個int,這就是爲什麼你的編譯器在你大喊大叫。在這種情況下,你確切知道你在做什麼,只需要一點點就說服編譯器。

+2

使用C風格演員不是一件好事,大部分時間應該避免。 – Rakete1111

6

str[i]爲char明確這樣的:

str[i] = (char)toupper(str[i]); 

或者:

str[i] = static_cast<char>(toupper(str[i])); 

爲了使操作更加C++友好。 std::toupper返回一個int,這會使編譯器抱怨。通過轉換返回值,你告訴編譯器你知道你在做什麼。

作爲一個方面說明,我建議在字符串中使用boost::to_upper()一次,像這樣:

#include <boost/algorithm/string.hpp> 
#include <string> 

std::string str = "hello"; 

boost::to_upper(str); //Is HELLO 

std::string newstr = boost::to_upper_copy<std::string>("hello"); //is HELLO 
+0

謝謝@Arnav ...實施了鑄造。我應該檢查toUpper的文檔 –

+0

函數'std :: transform'也可以用來將字符串轉換爲全部大寫或小寫。 –

1

toupper需求,在充分的通用性,應對EOF,這就是爲什麼它需要一個int爲參數並返回int

我傾向於埋葬這種複雜性和寫

#include <algorithm> 
std::transform(str.begin(), str.end(), str.begin(), ::toupper); 

,而是和關閉警告此代碼編譯。

+2

'transform'如何解決你提到的問題?你所做的就是掩蓋循環。 –

相關問題