arrays - 下标值既不是数组,也不是指针,也不是 vector 。在C中使用结构体获取n个字符串的输入

标签 arrays c string multidimensional-array c-strings

问题指出我从用户处获取输入,使用 C 中的结构输入 n 个名称。我编写了以下代码:

#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);

如何编写正确的代码?

我什至尝试将维度放入所使用的数组中并使用 scanf 函数。似乎没有任何效果,我一次又一次地收到错误,

最佳答案

这里有一些问题。首先,定义的结构是单个 int 的大小。 :

typedef struct employee{ 
    int code; 
    char name[]; 
} emp; 

那个name参数的大小为 0。这种定义在更高级的分配方法中很有用,我猜现在有点超出了您的技能范围。我们需要在那里提供实际尺寸:

#define MAX_NAME_LEN 128

typedef struct employee{
    int code;
    char name[MAX_NAME_LEN];
} emp;

代码中的原始错误是由于尝试像访问数组一样访问定义的结构(当它是单个实例时):

emp em;

我在评论中建议的方法是使用 n为此:

emp em[n];

如果您的编译器支持的话,这没问题,但是,这是一种称为 VLA 的特殊数组。如果我们想避免这种情况,我们可以像对 name 那样做。参数并提供尺寸:

#define MAX_STUDENTS 32
int main() {
   emp em[MAX_STUDENTS];

就我个人而言,我什至不知道如何使用scanf因为除了这样的家庭作业之外,它毫无用处。我用 scanf 替换了您的使用和gets对于 fgets这是 gets 的安全哥哥。 Don't use gets 。请注意atoi是一个简单的字符串到整数的转换函数。由于我们刚刚定义了学生数组的最大大小,因此我们需要强制执行该限制,这样我们就不会超出该数组的范围进行读取:

    int n = atoi(line);
    if (n <= 0 || n > MAX_STUDENTS) {
        printf("student count %d out of range (0, %d]\n", n, MAX_STUDENTS);
        return 1;
    }

这是一个可以帮助您入门的最终解决方案:

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

#define MAX_NAME_LEN 128
#define MAX_STUDENTS 32

typedef struct employee{
    int code;
    char name[MAX_NAME_LEN];
} emp;

int main () {
    char line[MAX_NAME_LEN];
    emp em[MAX_STUDENTS];
    printf ("Number of entries: ");
    fgets(line, MAX_NAME_LEN, stdin);

    // fgets keeps newline, so remove it.
    line[strcspn(line, "\n")] = '\0';
    int n = atoi(line);
    if (n <= 0 || n > MAX_STUDENTS) {
        printf("student count %d out of range (0, %d]\n", n, MAX_STUDENTS);
        return 1;
    }

    int i;
    for (i=0;i<n;i++){
        printf ("Enter name: ");
        fgets(em[i].name, MAX_NAME_LEN, stdin);
        em[i].name[strcspn(em[i].name, "\n")] = '\0';
    }

    return 0;
}

请注意,此问题的更通用解决方案不包括使用这些 MAX_*常量将通过 malloc 使用动态内存分配或calloc 。这种解决方案将允许学生的数量及其姓名的长度仅受系统上可用内存量的限制。然而,根据作业猜测,您还没有到达该主题。

关于arrays - 下标值既不是数组,也不是指针,也不是 vector 。在C中使用结构体获取n个字符串的输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76281432/

相关文章:

java - 如何在二维数组上调用接受数组作为参数的方法?

c++ - 套接字编程 : 'accept: Bad file descriptor'

c - 这个头文件有什么问题?

objective-c - 字段打包形成一个字节

java - 如何分解字符串?

javascript - string.match() 返回字符串而不是数组

arrays - ElasticSearch-Kibana:按键过滤数组

javascript - 在数组中获取高于平均值的值 - JS

c - 为什么我不能用字符串初始化这个指针?

arrays - 以 XML、JSON 或逗号分隔的美国城市、州和 zip ?