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

C语言ISBN-10读取功能无限请求输入问题排查

问题原因
  • 输入读取逻辑错误:现有代码使用scanf("%d")读取单个数字,但用户输入的是连续9位的完整字符串,%d会将整串9位数字作为一个整数存入isbn[i][0],导致内层循环剩余8个位置持续等待输入,程序永远无法完成一轮行读取,触发不了终止条件。
  • 计数器逻辑错误:cont变量未在每行读取前重置,是全局累计计数,只有所有输入的数字累计出现9个0才会触发终止,不符合"某一行全为0就终止"的需求。
  • 行参数值传递问题:isbn_read的形参lin是值传递,函数内修改的只是lin的副本,主函数中lin始终是未初始化的随机值,后续计算、打印逻辑也无法正常运行。
修复方案

修改点说明

  1. 输入格式符改为%1d,限定每次只读1位数字,用户输入的9位连续串会自动拆分存入对应数组元素。
  2. 每行读取前重置cont计数器,读取完一行后立即判断是否为全0,满足条件直接终止输入。
  3. lin改为指针传递,将有效行数回传给主函数。

修复后代码

isbn_read函数

// lin改为指针类型,用于回传有效行数
void isbn_read(int isbn[10][9], int *lin )
{
  int i, j;
  for (i = 0; i < 10; i++)
  {
    int cont = 0; // 每行开始前重置计数器
    for(j = 0; j < 9; j++)
    {
      scanf("%1d", &isbn[i][j]); // 每次只读1位
      if (isbn[i][j] == 0)
        cont++;
    }
    if (cont==9) // 当前行全为0,直接终止输入
    {
      break;
    }
  }
  *lin = i; // 有效行数为i,全0行不计入有效数据
}

主函数修改

int main ()
{
  int isbn[10][9], lin, d[10];
  isbn_read(isbn, &lin); // 传入lin的地址,获取有效行数
  isbn_dv(isbn, lin, d);
  isbn_print(isbn, lin, d);
  return 0;
}

修改后可直接匹配需求的输入输出示例,两个终止条件均可正常触发。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 12:36:03