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

为何我的C语言程序输出随机值?代码问题排查求助

C语言数字输入收集问题修复

问题分析

你的代码目标是收集6个有效数字,若首次输入不足则补充输入,但当前存在以下核心问题导致输出异常:

1. 数组未初始化产生随机值

首次遍历输入时,遇到非数字/空格字符会直接跳过当前answer[i]的赋值,这些未被赋值的数组位置会保留内存中的随机垃圾值。

2. 第二次输入的赋值逻辑错误

第二次输入处理时,直接以answer[i + count]的方式赋值:

  • 会覆盖首次输入中已填充的有效数字(比如案例1中首次输入的3、4被第二次输入的5、6覆盖)
  • 当i + count >=6时,会出现数组越界访问,触发未定义行为

3. 有效数字提取逻辑受限

仅检查输入字符串的前6个字符,无法完整提取输入中的所有有效数字(比如输入含非数字字符时,后面的有效数字会被忽略)

修正后的代码

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

int main() {
    int answer[6];
    char input[100];
    int digit_count = 0; // 已收集的有效数字数量

    // 第一次输入处理:提取所有有效数字
    fgets(input, sizeof(input), stdin);
    for (int i = 0; input[i] != '\0' && digit_count < 6; i++) {
        if (isdigit(input[i])) {
            answer[digit_count++] = input[i] - '0';
        }
    }

    // 若有效数字不足6个,提示补充输入
    while (digit_count < 6) {
        printf("您需要再输入 %d 位数字以完成猜测\n", 6 - digit_count);
        fgets(input, sizeof(input), stdin);
        // 从补充输入中提取有效数字,填充到answer数组
        for (int i = 0; input[i] != '\0' && digit_count < 6; i++) {
            if (isdigit(input[i])) {
                answer[digit_count++] = input[i] - '0';
            }
        }
    }

    // 打印结果
    for (int i = 0; i < 6; i++) {
        printf("%d ", answer[i]);
    }
    printf("\n");
    return 0;
}

修正说明

  1. 有效数字提取逻辑:遍历输入字符串的所有字符,只要是数字就收集到answer数组,直到凑够6个,不再限制只看前6个字符。
  2. 数组赋值顺序:用digit_count记录已收集的数字数量,每次提取到有效数字时,填充到answer[digit_count++],确保不会跳过或覆盖已有值。
  3. 循环补充输入:用while循环确保直到收集满6个数字才停止,即使补充输入中仍含非数字字符,也能自动提取有效部分。

测试案例验证:

  • 案例1:首次输入1234,提取4个数字;第二次输入56,提取2个数字,最终输出1 2 3 4 5 6
  • 案例2:首次输入12,提取2个数字;第二次输入3456,提取4个数字,最终输出1 2 3 4 5 6

内容的提问来源于stack exchange,提问作者Eason Hao

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.29 06:55:05