C语言用结构体输入n个字符串报错:下标值非数组/指针/向量,求修正
C语言结构体实现多用户姓名输入的问题解决
原错误代码
#include<stdio.h> typedef struct employee{ int code; char name[]; } emp; int main () { emp em; int n; printf ("Number of entries: "); scanf ("%d", &n); int i; for (i=0;i<n;i++){ printf ("Enter name: "); gets(em[i].name); } return 0; }
报错信息
T2.c:16:16: error: subscripted value is neither array nor pointer nor vector gets(em[i].name);
错误原因分析
emp em;定义的是单个结构体变量,并非数组,无法通过em[i]访问第i个用户信息,这是报错的直接原因。- 结构体中的
char name[]是柔性数组,必须配合动态内存分配使用,不能直接实例化。 gets函数已被C标准废弃,存在缓冲区溢出风险,不建议使用。
正确实现代码
方案1:固定姓名长度的结构体数组
若姓名长度可预先确定,直接定义固定大小字符数组,同时创建结构体数组存储多用户信息:
#include<stdio.h> #include<string.h> // 定义姓名最大长度 #define MAX_NAME_LEN 50 typedef struct employee{ int code; char name[MAX_NAME_LEN]; } emp; int main () { int n; printf ("Number of entries: "); scanf ("%d", &n); // 清空输入缓冲区的换行符,避免后续fgets读取空行 getchar(); // 定义结构体数组存储n个用户 emp em[n]; for (int i=0;i<n;i++){ printf ("Enter name for user %d: ", i+1); // 使用fgets读取姓名,避免缓冲区溢出 fgets(em[i].name, MAX_NAME_LEN, stdin); // 去除fgets读取到的换行符 char *newline = strchr(em[i].name, '\n'); if (newline != NULL) { *newline = '\0'; } } // 测试输出已输入的姓名 printf("\nEntered names:\n"); for (int i=0;i<n;i++){ printf("User %d: %s\n", i+1, em[i].name); } return 0; }
方案2:动态分配内存(适配不确定姓名长度场景)
使用指针配合动态内存分配,灵活存储任意长度的姓名:
#include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct employee{ int code; char *name; } emp; int main () { int n; printf ("Number of entries: "); scanf ("%d", &n); getchar(); // 动态分配结构体数组 emp *em = (emp*)malloc(n * sizeof(emp)); if (em == NULL) { printf("Memory allocation failed!\n"); return 1; } for (int i=0;i<n;i++){ printf ("Enter name for user %d: ", i+1); // 用临时缓冲区读取输入 char buffer[256]; fgets(buffer, sizeof(buffer), stdin); // 去除换行符 char *newline = strchr(buffer, '\n'); if (newline != NULL) { *newline = '\0'; } // 为姓名分配刚好足够的内存 em[i].name = (char*)malloc(strlen(buffer) + 1); if (em[i].name == NULL) { printf("Memory allocation failed for user %d!\n", i+1); // 释放已分配的内存避免泄漏 for (int j=0;j<i;j++){ free(em[j].name); } free(em); return 1; } strcpy(em[i].name, buffer); } // 测试输出已输入的姓名 printf("\nEntered names:\n"); for (int i=0;i<n;i++){ printf("User %d: %s\n", i+1, em[i].name); } // 释放所有动态分配的内存 for (int i=0;i<n;i++){ free(em[i].name); } free(em); return 0; }
内容的提问来源于stack exchange,提问作者Arnav Garg
相关产品推荐
相关产品推荐

