C语言编程中自定义结构体数组元素反复被覆盖问题求助
问题原因与修复方案
核心问题点
- 没有全局计数器记录当前已存储的有效名片数量,
AddNameCard、ListNameCard函数中定义的局部变量j未初始化,是随机垃圾值,完全无法正确定位数组写入/遍历位置,这是每次写入覆盖之前数据、列表只显示最后一条的核心原因。 - 新增名片的逻辑错误,不需要套循环,每次新增仅需向数组的下一个空位写入1条数据即可。
- 用
scanf读取字符串时,数组名本身就是首地址,不需要额外加&符号,属于语法错误。 - 主函数中
options变量未初始化,第一次进入while循环时的值是随机的,可能直接触发退出逻辑。 - 原
GetNameCard写死读取下标为1的元素,完全不符合按索引/ID查询的功能逻辑,已同步优化。
修复后完整代码
#include <stdio.h> #include <stdlib.h> #define Max_Size 5 typedef struct { int nameCardID; char personName[20]; char companyName[20]; } NameCard; NameCard nameCard[Max_Size]; // 新增全局计数器,记录当前已存储的名片数量,初始为0 int currentCount = 0; void AddNameCard() { // 先判断数组是否已满 if (currentCount >= Max_Size) { printf("\n名片存储已达上限,无法新增!\n"); return; } printf("\n"); // 直接往currentCount对应的空位写入新数据 printf("Enter Name Card ID: \n"); scanf("%d", &nameCard[currentCount].nameCardID); printf("Enter Person Name: \n"); // 数组名本身是地址,不需要加& scanf("%s", nameCard[currentCount].personName); printf("Enter Company Name : \n"); scanf("%s", nameCard[currentCount].companyName); // 写入完成后计数器加1 currentCount++; printf("\n新增成功!\n"); return; } void ListNameCard() { if (currentCount == 0) { printf("\n当前没有存储任何名片信息!\n"); return; } printf("\n"); printf("\nName_Card_ID Person_Name Company_Name \n"); // 遍历到currentCount为止,只输出有效数据 for (int i = 0; i < currentCount; i++){ printf("%d %s %s \n", nameCard[i].nameCardID, nameCard[i].personName, nameCard[i].companyName); } printf("\n"); return; } void GetNameCard() { int index; printf("\n请输入要查询的名片下标(从0开始):"); scanf("%d", &index); if (index < 0 || index >= currentCount) { printf("输入下标无效!\n"); return; } printf("%d %s %s\n", nameCard[index].nameCardID, nameCard[index].personName, nameCard[index].companyName); } int main() { // 初始化options,避免第一次循环值随机 int options = 0; while (options != 5) { printf("1:List Name Cards\n2:Add Name Card\n3:Remove Name Cards\n4:Get Name Cards\n5:quit\n"); printf("\n"); printf("What would you like to do? : "); scanf("%d", &options); switch (options) { case 1: ListNameCard(); break; case 2: AddNameCard(); break; case 3: printf("Case3 \n"); break; case 4: GetNameCard(); break; case 5: printf("quit \n"); break; default: printf("输入选项无效,请重新输入!\n"); } } return 0; }
内容的提问来源于stack exchange,提问作者ilyas
相关产品推荐
相关产品推荐

