C控制台应用输出异常求助:正数判断功能故障排查
C语言正数判断程序异常问题修复
问题场景
我是一名C语言初学者,想要开发一个程序:输入3个数值,判断每个数值是否为正数,当输入的正数数量超过2个时,将这些正数打印输出。但程序出现了异常输出,调试数小时仍未解决,相关代码及异常输出如下:
#include <stdio.h> int main() { const char arr[][20] = {"First Number : ", "Second Number : ", "Third Number : "}; int numbers[2]; // number list int posNumbers[2]; // positive number list int n = 0; // n for itinerating posNUmbers for ( int i = 0 ; i <= 2; i++) { printf("%s", arr[i]); scanf("%i", &numbers[i]); } // puts input in array for ( int i = 0 ; i <= sizeof(numbers) / sizeof(numbers[0]) + 1 ; i++ ) { if (numbers[i] > 0) { posNumbers[n + 1] = numbers[i]; } } // adds positive in array if (sizeof(posNumbers) / sizeof(posNumbers[0]) + 1 > 1) { printf("There are atleast 2 pos numbers, which are : \n"); for ( int i = 0; i <= sizeof(posNumbers) / sizeof(posNumbers[0]) + 1 ; i++) { printf("%i", posNumbers[i]); } } else { printf("THere are not enough positive numbers."); } }
异常输出
There are atleast 2 pos numbers, which are : 4419368778941968054388
代码错误分析
数组越界访问
numbers数组只定义了2个元素(索引0、1),但第一个循环i <= 2会访问numbers[2],超出数组范围,导致非法内存读写,破坏其他变量的内存。后续循环中i <= sizeof(numbers)/sizeof(numbers[0]) +1,计算后是i <= 3,会访问numbers[3],进一步越界。正数统计与存储逻辑错误
变量n初始为0但从未递增,存储正数时一直用posNumbers[n+1],也就是固定写入posNumbers[1],无法正确存储多个正数。posNumbers数组大小为2,但如果输入3个正数,数组容量不够,会再次越界。错误使用
sizeof判断有效元素数量sizeof(posNumbers)/sizeof(posNumbers[0])是数组的总元素数(2),加1后用来判断正数数量完全错误,因为sizeof不会统计实际存储的正数个数,应该用一个计数器变量来记录正数的数量。输出格式与越界问题
输出正数时没有添加分隔符,导致数字连在一起;同时循环越界会输出未初始化的内存垃圾值,就是你看到的乱码数字。
修正后的代码
#include <stdio.h> int main() { const char arr[][20] = {"First Number : ", "Second Number : ", "Third Number : "}; int numbers[3]; // 适配3个输入数字,调整数组大小 int posNumbers[3]; // 最多存储3个正数,调整数组大小 int posCount = 0; // 专门统计正数的数量 // 输入3个数字 for (int i = 0; i < 3; i++) { printf("%s", arr[i]); scanf("%d", &numbers[i]); } // 筛选正数并统计数量 for (int i = 0; i < 3; i++) { if (numbers[i] > 0) { posNumbers[posCount] = numbers[i]; posCount++; } } // 判断正数数量是否超过2个,符合条件则打印 if (posCount > 2) { printf("正数数量超过2个,分别是:\n"); for (int i = 0; i < posCount; i++) { printf("%d ", posNumbers[i]); } printf("\n"); } else { printf("正数数量不足3个。\n"); } return 0; }
修正说明
- 调整数组大小为3,适配输入3个数字的需求,避免越界。
- 用
posCount变量统计正数数量,存储时动态更新索引,确保每个正数都能正确存入数组。 - 用实际统计的
posCount判断是否满足条件,替代错误的sizeof计算。 - 输出时添加空格分隔数字,只循环到实际正数数量,避免输出垃圾值。
内容的提问来源于stack exchange,提问作者ramses
相关产品推荐
相关产品推荐

