使用std::isalnum判断字符是否为字母数字时出现误判问题求助
std::isalnum判断字符是否为字母数字时出现误判问题求助
嘿,我来帮你排查这个问题~
你遇到的情况其实是C++里<cctype>头文件中字符分类函数的一个常见坑!std::isalnum这个函数的参数要求有点特殊:它需要传入的是**unsigned char类型转换后的int值**,或者是EOF。但如果你的编译器默认把char当成有符号类型(大多数编译器都是这样),当输入的字符ASCII值大于127时,会被转换成负数,这时候调用std::isalnum就会触发未定义行为,导致误判。
先看你写的代码(我帮你补全了未写完的else分支):
char inTest; std::cout << " What do you want to Test : " << std::endl; std::cin >> inTest; if(std::isalnum(inTest)){ std::cout << "*" << inTest << "*" << " Is AlphaNumeric " << std::endl; }else{ std::cout << "*" << inTest << "*" << " Is NOT AlphaNumeric " << std::endl; }
这里的核心问题就是直接把char类型的inTest传给了std::isalnum,当输入非ASCII范围内的特殊字符时,就会出问题。
给你两个简单的解决办法:
办法一:转换为unsigned char再传入
修改判断条件,把inTest强制转换成unsigned char:if(std::isalnum(static_cast<unsigned char>(inTest)))这样就能确保函数接收到的参数在合法范围内,避免未定义行为。
办法二:直接用unsigned char定义变量
把变量类型改成unsigned char,从根源上避免符号问题:unsigned char inTest; std::cout << " What do you want to Test : " << std::endl; std::cin >> inTest; if(std::isalnum(inTest)){ std::cout << "*" << inTest << "*" << " Is AlphaNumeric " << std::endl; }else{ std::cout << "*" << inTest << "*" << " Is NOT AlphaNumeric " << std::endl; }
这两种方法都能解决你的误判问题,你可以根据自己的习惯选择~
备注:内容来源于stack exchange,提问作者Noob Boy
相关产品推荐
相关产品推荐

