C语言循环执行后数组未更新、打印结果异常问题求助
代码问题汇总
- 数组越界:定义
int levelArray[6]的合法下标范围是05,但原代码全程使用下标16,访问b[6]和levelArray[6]属于越界操作,会篡改未知内存数据,导致运行结果异常。 - 函数未实际执行:while循环中
void updateLevel(playerPoints, levelArray);是函数声明的写法,不是函数调用,updateLevel函数从未被执行,数组自然不会更新。正确调用不需要加返回值类型,直接写updateLevel(playerPoints, levelArray);即可。 - 打印参数错误:打印时传入
&levelArray[x]是取数组元素的内存地址,输出的是地址值而非计数结果,需要删除所有printf中的取地址符&。 - 输入逻辑错误:第一次输入的playerPoints会被while循环内的scanf直接覆盖,第一个输入值永远不会被处理;同时
fflush(stdin)属于C标准未定义行为,仅可用于输出流清空,不可用来处理输入缓冲区。 - 冗余变量冲突:main函数中定义的
int updateLevel和函数名重名,且该变量和displayLevels全程未使用,可直接删除避免编译问题。
修正后完整代码
#include <stdio.h> #include <stddef.h> #define SENTINEL -1 void updateLevel (int playerPoints, int b[]); int main(void) { // 数组下标0~5分别对应等级1~6 int levelArray[6]; for (size_t i = 0; i < 6; ++i) { levelArray[i] = 0; } int playerPoints; printf ("Player points (-1 to quit): ", SENTINEL); scanf ("%d", &playerPoints); while (playerPoints != SENTINEL) { // 先处理当前输入的数值,再读取下一次输入 updateLevel(playerPoints, levelArray); printf ("Player points (-1 to quit): ", SENTINEL); scanf ("%d", &playerPoints); } printf ("\n"); printf ("T O T A L S\n"); printf ("\n"); printf ("Level 1\t"); printf ("%d\n", levelArray[0]); printf ("Level 2\t"); printf ("%d\n", levelArray[1]); printf ("Level 3\t"); printf ("%d\n", levelArray[2]); printf ("Level 4\t"); printf ("%d\n", levelArray[3]); printf ("Level 5\t"); printf ("%d\n", levelArray[4]); printf ("Level 6\t"); printf ("%d\n", levelArray[5]); } void updateLevel(int playerPoints, int b[]) { if ((playerPoints > -1) && (playerPoints < 10)) { b[0]++; } if ((playerPoints > 9) && (playerPoints < 20)) { b[1]++; } if ((playerPoints > 19) && (playerPoints < 30)) { b[2]++; } if ((playerPoints > 29) && (playerPoints < 40)) { b[3]++; } if ((playerPoints > 39) && (playerPoints < 50)) { b[4]++; } if (playerPoints > 49) { b[5]++; } }
内容的提问来源于stack exchange,提问作者Austin Buchanan
相关产品推荐
相关产品推荐

