C ++如何在使用"tolower"时将char转换为int

c++ how to convert char to int while using `tolower`

本文关键字:quot char 时将 转换 int tolower      更新时间:2023-10-16

我尝试编译一个简单的表达式:

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::tolowerlocale版本,该版本是模板化的,可以正确处理字符类型。您可以像这样使用它:

// 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:: 版本,请使用它!:)