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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 10:27:03