繁体   English   中英

警告C4244 \\'=':从'int'转换为'char',可能会丢失数据?

[英]Warning C4244 \ '=': conversion from 'int' to 'char', possible loss of data?

在编写解决谜题的程序时,我在以下代码段中遇到警告:

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',可能会丢失数据?

有没有办法摆脱这个警告?

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

将它显式地转换为char

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

toupper()被定义为返回一个int ,这就是你的编译器对你大吼大叫的原因。 在这种情况下,您确切地知道您在做什么,您只需要稍微说服编译器。

toupper需要完全通用地处理EOF,这就是为什么它需要一个int作为参数并返回一个int

我倾向于埋葬这种复杂性并写下来

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

相反,并关闭编译此代码的警告。

我遇到了类似的问题,因为我正在使用的代码是使用-Wall,我收到有关int可能会丢失数据的警告。 现在我可以用一个简单的方法:

std::string s = "Hello World";

for (char& c : s)
{
    if (c >= 'a' && c <= 'z)
       c &= 0x20;
}

但这只是因为我可以保证,我正在处理的是纯ASCII,绝不是别的什么。 正如其他人提到的那样,最好使用std :: transform():: toupper() ,我唯一的问题是他们的特殊答案是他们建议关闭你使用这种方法得到的警告。 你仍然会得到它们因为:: toupper():: tolower()都从它们的转换中返回int。

所以我最终得到了两个世界中最好的东西,就是像下面那样投射:: toupper的返回代码。 这意味着我不必禁用此转换的警告。

std::string s = "Hello World";
std::transform(s.begin(), s.end(), s.begin(), [](int c) -> char { return static_cast<char>(::tolower(c)); });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM