C语言结构体数组打印异常:重复输出最后一条输入内容
问题分析与修复
你的代码问题出在指针ptr没有随着循环迭代移动,导致所有输入都覆盖到了数组的第一个元素上,最终打印的自然是最后一次输入的内容。
具体问题点:
- 初始化指针后,输入循环里每次处理完一个元素,都没有让
ptr指向数组的下一个元素,所以所有输入都在修改同一个内存位置(数组首元素),后面的输入直接覆盖了前面的内容。 - 打印循环同样没有移动指针,所以两次输出的都是最后一次覆盖的那个元素的数据。
修复后的代码:
#include<stdio.h> struct my_structure { char name[20]; int number; int rank; }; int main() { int n,i; scanf("%d",&n); struct my_structure variable[n]; struct my_structure *ptr; ptr = variable; // 数组名本身就是首元素地址,无需额外取址& // 输入循环:每次处理后让指针前进一个结构体大小 for(i=0; i<n; i++) { scanf("%s",ptr->name); scanf("%d",&ptr->number); scanf("%d",&ptr->rank); ptr++; // 关键:让指针指向数组的下一个元素 } // 打印前把指针重置回数组首地址 ptr = variable; for(i=0; i<n; i++) { printf("NAME: %s\n", ptr->name); printf("NUMBER: %d\n", ptr->number); printf("RANK: %d\n", ptr->rank); // 加换行让输出更整洁 ptr++; // 打印后同样移动指针 } return 0; }
更直观的替代方案(下标访问):
如果你觉得指针操作容易出错,也可以直接通过数组下标访问元素,可读性更强:
#include<stdio.h> struct my_structure { char name[20]; int number; int rank; }; int main() { int n,i; scanf("%d",&n); struct my_structure variable[n]; // 输入循环用下标访问 for(i=0; i<n; i++) { scanf("%s",variable[i].name); scanf("%d",&variable[i].number); scanf("%d",&variable[i].rank); } // 打印循环用下标访问 for(i=0; i<n; i++) { printf("NAME: %s\n", variable[i].name); printf("NUMBER: %d\n", variable[i].number); printf("RANK: %d\n", variable[i].rank); } return 0; }
内容的提问来源于stack exchange,提问作者Vinoth Viru
相关产品推荐
相关产品推荐

