CS50 Scrabble题目point函数计分错误问题求助
CS50 Scrabble题目:point函数分数累加错误修复
你的代码存在两个核心问题,导致分数无法正确累加:
1. 错误使用位或运算符|判断字符匹配
你写的ply[i] == ('a'|'e'|'i'|...)完全不符合逻辑。|是位或运算符,它会将括号内所有字符的ASCII值做二进制位运算,最终得到一个单一数值,这个数值和任何输入字符的ASCII值都不相等,因此所有if/else if分支都会被跳过,直接执行else分支加10分。
正确写法应该使用逻辑或运算符||,逐个判断字符是否匹配:
if (ply[i] == 'a' || ply[i] == 'e' || ply[i] == 'i' || ply[i] == 'l' || ply[i] == 'n' || ply[i] == 'o' || ply[i] == 'r' || ply[i] == 's' || ply[i] == 't' || ply[i] == 'u')
另外,题目默认不区分大小写(比如'A'和'a'分数相同),可以先将字符转成小写,避免漏判:
#include <ctype.h> // 需要引入该头文件使用tolower函数 // 在point函数的循环内: char c = tolower(ply[i]); if (c == 'a' || c == 'e' || ...)
2. else语句语法错误
else后面的代码块用了圆括号(),不符合C语言语法规范,部分编译器可能勉强通过,但容易引发异常行为。应替换为花括号{}:
else { score += 10; }
修复后的完整代码
#include <cs50.h> #include <stdio.h> #include <string.h> #include <ctype.h> // 新增,用于tolower函数 int score1 = 0; int score2 = 0; int point(string ply); void compare(int pl1, int pl2); int main(void) { string ply1 = get_string("Player 1: "); string ply2 = get_string("Player 2: "); score1 = point(ply1); score2 = point(ply2); compare(score1, score2); } // calculate point int point(string ply) { int score = 0; for(int i = 0; i < strlen(ply); i++) { char c = tolower(ply[i]); // 转小写统一判断 if(c == 'a' || c == 'e' || c == 'i' || c == 'l' || c == 'n' || c == 'o' || c == 'r' || c == 's' || c == 't' || c == 'u') { score += 1; } else if(c == 'd' || c == 'g') { score += 2; } else if(c == 'b' || c == 'c' || c == 'm' || c == 'p') { score += 3; } else if(c == 'f' || c == 'h' || c == 'v' || c == 'w' || c == 'y') { score += 4; } else if(c == 'k') { score +=5; } else if(c == 'j' || c == 'x') { score += 8; } else if(c == 'q' || c == 'z') // 补充原代码遗漏的10分字符 { score += 10; } } return score; } // compare score void compare(int pl1, int pl2) { if(pl1 < pl2) { printf("Player 2 won!\n"); } else if(pl1 > pl2) { printf("Player 1 won!\n"); // 修正大小写,保持统一 } else { printf("tie\n"); } }
额外说明:原代码else分支直接加10分,但实际上只有'q'和'z'对应10分,修复后补充了这两个字符的判断,避免非字母字符错误加分。
内容的提问来源于stack exchange,提问作者Lanvo
相关产品推荐
相关产品推荐

