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

为什么给出的C代码运行异常?仅能读取员工姓名无法读取年龄与薪资

问题诊断

你的代码存在3个核心错误直接导致无法正常读取年龄和薪资:

  • scanf格式字符串中多余的空白字符:%s\n、%lf 、%d \n里的\n和末尾空格属于无效写法,scanf中的空白字符会强制跳过所有连续空白,直到遇到非空白字符才结束匹配,导致输入逻辑阻塞错位。
  • 读取数值型变量时缺少取地址符&:scanf("%lf", (ptr + i)->salary)和scanf("%d", (ptr + i)->age)没有对变量取地址,直接将变量值作为内存地址传入,属于非法内存访问,自然无法正常读取数值。
  • 补充优化点:%s默认以空白符为分隔符,无法读取带空格的姓名,可替换为%[^\n]适配含空格的姓名输入。
修正后可运行代码
#include <stdio.h>
#include <stdlib.h>
struct worker
{
 char sri[100];
 int age;
 double salary;
};
int main()
{
  struct worker *ptr;
  int n;
  printf("输入员工数量:");
  scanf("%d", &n);
  // 分配n个worker结构体的内存
  ptr = (struct worker *)malloc(n * sizeof(struct worker));
  if(ptr == NULL) {
    printf("内存分配失败");
    return 1;
  }

  for (int i = 0; i < n; ++i)
  {
    printf("第%d位员工:\n", i+1);
    printf("输入姓名:");
    scanf("%s", (ptr + i)->sri);
    printf("输入薪资:\n");
    scanf("%lf", &(ptr + i)->salary);
    printf("输入年龄:\n");
    scanf("%d", &(ptr + i)->age);
  }

  for (int i = 0; i < n; ++i)
  {
    printf("第%d位员工信息:", i+1);
    printf("姓名=%s ", (ptr + i)->sri);
    printf("年龄=%d, ", (ptr + i)->age);
    printf("薪资=%.2lf\n", (ptr + i)->salary);
  }
  free(ptr);
  return 0;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 10:45:01