C ++如何在使用"tolower"时将char转换为int
c++ how to convert char to int while using `tolower`
我尝试编译一个简单的表达式:
char_to_int(tolower(row[y]))
但是,我在尝试编译它时遇到以下错误:
error: implicit conversion loses integer precision: 'int' to 'char' [-Werror,-Wimplicit-int-conversion]
if (char_to_int(tolower(row[y])) > n
char_to_int
的签名是:
unsigned long char_to_int(char c)
并且row[y]
的类型是char
.
为什么我会收到此错误,如何解决?
根据您的错误信息,我假设您使用的是来自<cctype>
的std::tolower
(或等效地,来自<ctype.h>
的::tolower
(,而不是来自<locale>
的std::tolower
。
从错误信息中可以直截了当地看出错误的原因:char_to_int
期望char
,但tolower
返回int
。这将导致信息丢失。
为什么tolower
返回一个int
,而不仅仅是一个char
?因为它可以接受并返回 EOF,这可能超出任何char
的范围。
修复可以很简单:更改char_to_int
以接受int
,或执行中间步骤以丢弃可能的 EOF。
std::tolower
实际上并没有在char
上运行:它在int
上运行!此外,还存在未定义行为的风险:如果您的机器上char
是有符号类型,则"负"字符将对应于负整数,std::tolower
无法处理。
解决此问题的一种方法是在使用前手动强制转换类型:
char_to_int(static_cast<char>(
std::tolower(static_cast<unsigned char>(row[y]))));
。不幸的是,这有点混乱,但这就是你必须做的。
或者,您可以使用std::tolower
的locale
版本,该版本是模板化的,可以正确处理字符类型。您可以像这样使用它:
// std::locale{} is an object representing the default locale
// you may specify a locale precisely if needed; see the above links
char_to_int(std::tolower(row[y], std::locale{}));
> tolower 返回一个 int. std::tolower 是一个模板,并且可以正确处理 char。一般来说,如果你正在调用的任何函数都有一个 std:: 版本,请使用它!:)