-1

我想创建一个数据库,将 5000 个名称和 5000 个对应工资的列表存储到一个数组中,我根本找不到问题,因为控制台崩溃或编译器给我以下错误:“无法转换” char* ( )[30]' 到 'char ' 用于参数 '1' 到 'char*' fgets(char*,int,*FILE)"。

编辑:我改变了我在代码中能找到的任何东西,我似乎特别对这一行有疑问:

person* TAB = calloc(N, sizeof(struct)); 

我无法发现其他错误(缺乏经验),而且我不确切知道该使用什么来代替 fgets 放入一行。

#include <stdio.h>
#include <stdlib.h>
#define N 5000
typedef struct {
  char name[30]
  int  salary;
} person;
int main()
{
person* TAB = calloc(N, sizeof(struct));
FILE * input;
input = fopen("in.txt","r+");
int nr=0;
int r;
while(nr<5000)
    {
      fscanf(input,"%s",TAB[nr].name);
      fscanf(input,"%d",TAB[nr].salary);
      nr++;
    }
printf("%s %d",TAB[1].name,TAB[1].salary);
fclose(input);
return 0;
}
4

3 回答 3

1

你真的应该避免将这么多的数据放在堆栈上,这是一个像这样的普通变量通常会做的事情。它将占用大约 5000 * (30 + 4 * 5000) = 95 MB 的堆栈空间,这可能超出了您的操作系统认为合理的范围。

无论如何,解决方法是不要在堆上分配它;解决方法是更改​​声明。我相信存在逻辑错误,因为您为每人5000 工资分配空间,这可能不是您的意思。

此外,该name字段应该是一个字符数组,但您已将其声明为字符指针数组,这就是警告的全部内容。

我相信你应该有:

struct person
{
    char name[30];
    int  salary;
};

这会将内存使用量struct person TAB[N];降低到大约 5000 * (30 + 4) 或大约 166 KB,这更合理。这假设一个 4 字节int,这是一种非常常见的情况。

最后,您的文件读取代码设计得不是很好,它可能无法正常工作。

研究使用fgets()读取行,在失败时停止(即从不调用feof()),然后将每一行解析/标记为已读。请记住,名称可以包含空格,这将停止%ssscanf()

于 2013-10-06T16:58:16.770 回答
1

名称结构成员不应声明为 30 个字符指针,并且薪水是每个名称一个,所以它应该看起来像这样

typedef struct {
  char name[30]
  int  salary;
} person;

现在为了将它作为一个数组,你最好在堆上分配

person* persons = calloc(N, sizeof(struct));

现在您可以访问一个人的姓名和薪水

persons[3].name
persons[3].salary

...

fgets(persons[nr].name,30,input); // although u may want to remove \n
于 2013-10-06T17:01:16.203 回答
0
struct person
{
    char* name[30];

我想你的意思是char name[30]。也就是说,如果您想要一个最多 29 个字节的名称。

稍后你会这样做:

fgets(&TAB[nr].name,30,input);

为什么要取地址?如果您在上面进行更改,则TAB[nr].name应该是 type char[30],它应该根据需要退化为 a char*

于 2013-10-06T17:00:32.750 回答