C语言ISBN-10读取功能无限请求输入问题排查
问题原因
- 输入读取逻辑错误:现有代码使用
scanf("%d")读取单个数字,但用户输入的是连续9位的完整字符串,%d会将整串9位数字作为一个整数存入isbn[i][0],导致内层循环剩余8个位置持续等待输入,程序永远无法完成一轮行读取,触发不了终止条件。 - 计数器逻辑错误:
cont变量未在每行读取前重置,是全局累计计数,只有所有输入的数字累计出现9个0才会触发终止,不符合"某一行全为0就终止"的需求。 - 行参数值传递问题:
isbn_read的形参lin是值传递,函数内修改的只是lin的副本,主函数中lin始终是未初始化的随机值,后续计算、打印逻辑也无法正常运行。
修复方案
修改点说明
- 输入格式符改为
%1d,限定每次只读1位数字,用户输入的9位连续串会自动拆分存入对应数组元素。 - 每行读取前重置
cont计数器,读取完一行后立即判断是否为全0,满足条件直接终止输入。 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
相关产品推荐
相关产品推荐

