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

Visual Studio下C语言UPC码验证程序输入后无响应问题求助

问题分析与修复方案

你的程序无响应的核心问题出在输入处理部分,还有一个小细节错误,咱们一步步拆解:

1. 输入处理的致命错误

你用scanf_s("%d%d%d%d%d%d%d%d%d%d%d%d", ...)来读取UPC码,但这个格式要求用户输入12个用空格/回车分隔的整数,而你实际输入的是连续的12位数字(比如031564532525)。此时scanf_s会一直等待你输入足够的分隔开的整数,所以程序看起来“卡住”了。

另外,开头的d是UPC的第一位,如果输入以0开头(比如你示例的031564532525),用%d读取会直接丢失前导0,这也会导致后续校验计算完全错误。

2. system("pause")的位置错误

你把system("pause")放在了return 0;之后,这行代码永远不会被执行——因为return 0已经直接结束了main函数的运行。


修复后的代码

下面是修正后的版本,我们用%1d格式符逐个读取连续的数字(完美支持前导0),同时调整system("pause")的位置:

#include <stdio.h>
#include <stdlib.h> // 引入system函数所需的头文件

int main() {
    // 初始化UPC的12位数字
    int d, i1, i2, i3, i4, i5, j1, j2, j3, j4, j5, end_dig;
    int first_sum, second_sum, total, last_digit;

    printf("Enter the UPC code:\n");
    // 使用%1d逐个读取连续的数字,确保前导0不会丢失
    scanf_s("%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d%1d", 
            &d, &i1, &i2, &i3, &i4, &i5, &j1, &j2, &j3, &j4, &j5, &end_dig);

    // 计算校验位
    first_sum = d + i2 + i4 + j1 + j3 + j5;
    second_sum = i1 + i3 + i5 + j2 + j4;
    total = (3 * first_sum) + second_sum;
    last_digit = 9 - ((total - 1) % 10);

    // 验证并输出结果
    if (end_dig == last_digit) {
        printf("VALID\n");
    } else {
        printf("NOT VALID\n");
    }

    system("pause"); // 移到return之前,确保程序结束前会暂停
    return 0;
}

另一种更简洁的方案:读取字符串处理

如果觉得逐个定义变量太繁琐,也可以读取整个字符串,再逐个转换为数字处理:

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

int main() {
    char upc[13]; // 存储12位数字+字符串结束符
    int digits[12];
    int first_sum = 0, second_sum = 0, total, last_digit;

    printf("Enter the UPC code:\n");
    // 读取最多12位的字符串,避免缓冲区溢出
    scanf_s("%12s", upc, (unsigned)_countof(upc));

    // 将字符串字符转为数字数组
    for (int i = 0; i < 12; i++) {
        digits[i] = upc[i] - '0';
    }

    // 计算校验位
    first_sum = digits[0] + digits[2] + digits[4] + digits[6] + digits[8] + digits[10];
    second_sum = digits[1] + digits[3] + digits[5] + digits[7] + digits[9];
    total = (3 * first_sum) + second_sum;
    last_digit = 9 - ((total - 1) % 10);

    if (digits[11] == last_digit) {
        printf("VALID\n");
    } else {
        printf("NOT VALID\n");
    }

    system("pause");
    return 0;
}

这样修改后,你输入连续的12位数字(包括带前导0的),程序就能正常处理并输出结果了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:38:17