You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:25:22