正确做法是先将char显式转为unsigned char再传给std::isprint,否则有符号扩展会导致未定义行为;它可识别ascii 0–31和127等控制字符,但不处理unicode控制符,且windows非法字符需额外黑名单检查。

用 std::isprint 配合 static_cast<unsigned char></unsigned> 判断单字节是否可打印
直接对字符串每个字符调用 std::isprint 是错的——它要求参数是 unsigned char 或 EOF,而 char 在某些平台(如 ARM、部分 GCC 配置)默认为有符号类型,负值会触发未定义行为。常见表现是程序在某些文件名上崩溃或误判。
正确做法是对每个 char 显式转成 unsigned char 后再传入:
for (char c : filename) {
if (!std::isprint(static_cast<unsigned char>(c))) {
return true; // 发现非法控制字符
}
}</unsigned>
-
std::isprint返回false的包括:ASCII 0–31(含
