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

C++程序运行崩溃及输入异常问题求助

问题分析与解决方案

看起来你碰到了两个C语言开发里很常见的输入和逻辑问题,我来帮你一步步解决:

1. 录入数据时首次循环无法输入名称

这个问题几乎都是输入缓冲区残留换行符导致的:
当你用scanf("%d", &count)读取记录数量时,用户输入数字后会按回车,这个回车的\n会留在输入缓冲区里。接下来如果用gets或者fgets读取名称,它们会直接把这个\n当成输入内容,看起来就像是跳过了首次输入。

修复方案:

  • 最简单的方法:在scanf读取完数字后,用getchar()吃掉残留的换行符:
int count;
printf("请输入要录入的记录数量:");
scanf("%d", &count);
getchar(); // 清除缓冲区里的换行符
  • 更稳妥的方法:统一用fgets读取所有输入,再用sscanf解析数字,彻底避免缓冲区问题:
char inputBuf[50];
int count;
printf("请输入要录入的记录数量:");
fgets(inputBuf, sizeof(inputBuf), stdin);
sscanf(inputBuf, "%d", &count);

另外,建议用fgets代替gets读取名称(gets不安全,容易缓冲区溢出),读取后记得去掉末尾的换行符:

printf("请输入名称:");
fgets(record[i].name, sizeof(record[i].name), stdin);
// 去掉fgets读取到的换行符
record[i].name[strcspn(record[i].name, "\n")] = '\0';

2. 搜索函数执行时崩溃

崩溃的常见原因有几种,你可以按顺序排查:

原因1:数组越界访问

检查搜索函数的循环条件,比如是不是写成了i <= count而不是i < count。如果你的数组是record[count],那合法的索引是0到count-1,访问record[count]就会越界,直接触发崩溃。

原因2:字符串比较错误(如果No2是字符串类型)

如果你的编号No2是字符串,千万不能用==比较,==比较的是指针地址而不是内容。错误的写法会导致逻辑错误,甚至在某些情况下触发内存访问异常:

// 错误写法:
if (record[i].No2 == targetNo) { ... }
// 正确写法:用strcmp比较
if (strcmp(record[i].No2, targetNo) == 0) { ... }

原因3:内存分配问题(如果用了动态数组)

如果你的记录数组是用malloc动态分配的,一定要检查分配是否成功。如果malloc返回NULL,后续访问这个数组就会直接崩溃:

Record *record = malloc(count * sizeof(Record));
if (record == NULL) {
    printf("内存分配失败!\n");
    exit(1); // 终止程序,避免后续错误
}

调试小技巧

你可以在搜索函数里加几个printf,打印当前循环的索引、要比较的编号值,看看程序崩溃前执行到了哪一步,这样更容易定位问题。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:14:22