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
相关产品推荐
相关产品推荐

