isupper()函数无法识别A-F、Z等大写字母的原因求助
问题根源:错误将
isupper()返回值与true直接比较 核心问题
ctype.h库中的isupper()、isalpha()、isdigit()这类字符判断函数,返回值并非标准布尔值true/false:
- 满足条件时,返回任意非零整数(具体值由编译器实现决定,不一定是1)
- 不满足条件时,返回0
你代码中用isupper(c) == true做判断,而C里true通常被定义为1,当isupper()返回的非零值不是1时,比较结果为假,导致A、B、C等大写字母无法进入预期分支。
修复方案
1. 修正rotate函数的判断逻辑
直接利用非零值为真的特性,删除硬编码的字符判断,同时用字符常量替代ASCII码提升可读性:
char rotate(char c, int key) { // Prepare for wrapping around key = key % 26; // Check for alphabetical letter if (!isalpha(c)) { return c; } else if (isupper(c)) { return (char) (((int) c - 'A' + key) % 26 + 'A'); } else { return (char) (((int) c - 'a' + key) % 26 + 'a'); } }
2. 优化only_digits函数的判断逻辑
同样修正isdigit()的判断方式,同时优化遍历逻辑(发现非数字直接返回,无需遍历全部):
bool only_digits(string s) { for (int i = 0; i < strlen(s); i++) { if (!isdigit(s[i])) { return false; } } return true; }
内容的提问来源于stack exchange,提问作者kevin-sekol
相关产品推荐
相关产品推荐

