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

如何用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,不是做除法

正确的校验逻辑应该是:

  1. 初始化总和为0
  2. 循环遍历10位,第i位(从0到9)乘以(i+1)(第一位乘1,第二位乘2…第十位乘10)
  3. 把每一步的结果累加到总和
  4. 最后判断总和是否能被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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:49:52