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
相关产品推荐
相关产品推荐

