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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:53:08