如何用C语言计算ISBN?代码中ISBN数组初始化报错求助
解决C语言ISBN校验的数组与计算问题
嘿,咱们先拆解你代码里的几个核心问题,再一步步修正过来:
1. 数组初始化的错误
你写的int isbn[] = 0;完全不符合C语言的数组规则哦。数组初始化有两种正确姿势:
- 要么直接指定数组大小,比如
int isbn[10];(因为ISBN-10是固定10位) - 要么用初始化列表赋值,比如
int isbn[] = {1,2,3,...};
而你是要从用户输入获取ISBN,所以直接声明一个固定大小的数组就行:int isbn[10];
2. 输入ISBN的方式错误
你用scanf("%d", &isbn);是错的——isbn是数组名,代表数组的首地址,而%d是用来读取单个整数的。这里给你两种实用的输入处理方案:
方案一:读取字符串(支持含X的ISBN)
ISBN最后一位可能是X(代表10),用字符串处理最灵活:
char isbn_str[11]; // 存10位字符+字符串结束符 printf("Please enter ISBN number: \n"); scanf("%s", isbn_str); // 把字符串转成数字数组,处理X的情况 int isbn[10]; for (int i = 0; i < 9; i++) { isbn[i] = isbn_str[i] - '0'; // 字符转数字的小技巧 } // 单独处理最后一位 if (isbn_str[9] == 'X' || isbn_str[9] == 'x') { isbn[9] = 10; } else { isbn[9] = isbn_str[9] - '0'; }
方案二:读取长整数后拆分(仅支持纯数字ISBN)
如果只需要处理不含X的纯数字ISBN,可以用long long存储输入再拆分每一位:
long long isbn_num; printf("Please enter ISBN number: \n"); scanf("%lld", &isbn_num); int isbn[10]; // 从最后一位开始拆分数字 for (int i = 9; i >= 0; i--) { isbn[i] = isbn_num % 10; isbn_num /= 10; }
3. 校验逻辑的错误
你的循环累加逻辑完全跑偏了:
sum1 = sum + sum;这会把当前位的计算结果翻倍,而不是累加到总和里result = sum / 11;正确的校验规则是总和模11等于0,不是做除法
正确的校验逻辑应该是:
- 初始化总和为0
- 循环遍历10位,第i位(从0到9)乘以
(i+1)(第一位乘1,第二位乘2…第十位乘10) - 把每一步的结果累加到总和
- 最后判断总和是否能被11整除(即
sum % 11 == 0)
完整修正后的代码(支持含X的ISBN)
#include <cs50.h> #include <stdio.h> #include <ctype.h> // 用于toupper函数统一字符大小写 int main(void) { char isbn_str[11]; printf("Please enter ISBN number: \n"); scanf("%s", isbn_str); int isbn[10]; // 处理前9位,先校验是否为数字 for (int i = 0; i < 9; i++) { if (!isdigit(isbn_str[i])) { printf("Invalid ISBN format\n"); return 1; } isbn[i] = isbn_str[i] - '0'; } // 处理第10位,支持X/x char last_char = toupper(isbn_str[9]); if (last_char == 'X') { isbn[9] = 10; } else if (isdigit(last_char)) { isbn[9] = last_char - '0'; } else { printf("Invalid ISBN format\n"); return 1; } // 计算校验总和 long long sum = 0; for (int num = 0; num < 10; num++) { sum += isbn[num] * (num + 1); // 第num位对应权重是num+1 } // 判断ISBN是否有效 if (sum % 11 == 0) { printf("Yes\n"); } else { printf("No\n"); } return 0; }
额外小提示
- ISBN-10的最后一位允许是0-9或X,所以用字符串处理是最合理的选择,避免纯数字输入无法处理X的情况
- 代码里加了格式校验,能防止用户输入非数字或非法字符
- 累加时用
long long是个好习惯——虽然这里计算量很小不会溢出,但提前规避溢出风险总是没错的
内容的提问来源于stack exchange,提问作者Tallulah
相关产品推荐
相关产品推荐

