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

C语言中printf无法识别结构体元素的原因及解决

结构体变量未声明编译错误的解决方法

问题根源

你定义结构体变量时用的是drivieri,但后续访问成员时全部误写成了driveri,变量名拼写不一致,导致编译器找不到driveri这个变量,所以报出未声明的错误。

修正后的代码

把所有错误的driveri替换为drivieri即可,另外顺便替换掉不安全的gets函数(该函数已被C标准废弃),改用fgets处理输入:

#include <stdio.h>
#include <string.h>

struct manager
{
    char name[50];
    int dln;
    char route[100];
    float kms;
};

int main()
{
    int n;
    printf("Enter the number of drivers\n");
    char d;
    scanf("%d%c",&n, &d); // 吃掉输入n后的换行符

    for (int i=1;i<=n;i++)
    {
        struct manager drivieri;
        char arr1[50];
        
        printf("\nEnter the name of driver %d\n",i);
        fgets(arr1, sizeof(arr1), stdin);
        strtok(arr1, "\n"); // 去掉fgets读取到的换行符
        strcpy(drivieri.name, arr1);
        
        printf("\n\n* * * * * * *\n");
        printf("The name of Driver %d is: %s",i,drivieri.name);
        printf("\n* * * * * * *\n\n");

        int a;
        printf("\nEnter the Driving license number of driver %d\n",i);
        scanf("%d",&a);
        drivieri.dln=a;
        scanf("%c", &d); // 吃掉输入dln后的换行符
        
        printf("\n\n* * * * * * *\n");
        printf("The driving license number of Driver %d is: %d",i,drivieri.dln);
        printf("\n* * * * * * *\n\n");

        char arr2[100];
        printf("\nEnter the route of driver %d\n",i);
        fgets(arr2, sizeof(arr2), stdin);
        strtok(arr2, "\n");
        strcpy(drivieri.route, arr2);
        
        printf("\n* * * * * * *\n");
        printf("The route of Driver %d is: %s",i,drivieri.route);
        printf("\n* * * * * * *\n\n");

        float b;
        printf("\nEnter the number of kilometers, driver %d have driven\n",i);
        scanf("%f", &b);
        drivieri.kms=b;
        scanf("%c", &d); // 吃掉输入kms后的换行符
        
        printf("\n* * * * * * *\n");
        printf("The Driver %d have driven %.2f kms.",i,drivieri.kms); // 用%.2f优化输出格式
        printf("\n* * * * * * *\n");
    }
    return 0;
}

额外说明

  • 关于gets函数:gets不会检查输入长度,容易导致缓冲区溢出,严重时会引发程序崩溃或安全问题,因此C11标准已经将其移除,推荐使用fgets替代。
  • 输入缓冲区处理:每次使用scanf读取数值后,输入缓冲区会残留换行符,如果不处理,后续的fgets会直接读取这个换行符,导致输入为空。代码中用scanf("%c", &d)来吃掉这些残留的换行符。
  • 输出格式优化:打印公里数时用%.2f可以控制小数位数,让输出更美观。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 14:36:52