【发布时间】:2014-12-12 00:19:36
【问题描述】:
我正在学习使用结构,当我用 C 做一个练习时,我就产生了这个疑问。 我有这个代码:
#include <stdio.h>
#include <stdbool.h>
#include <string.h>
#include <errno.h>
#define MAX_STRING 256
#define MAX_CHILD 2000
#define MAX_GIFTS 20
#define MAX_LINE 1024
typedef char String[MAX_STRING];
typedef char Line[MAX_LINE];
typedef struct {
String child_name;
int grade; //integer between 0 and 5
String gift_name;
int price; //price of the gift
} Data;
typedef struct {
String name;
int price;
bool received; //true if the child will get this gift
} Gift;
typedef Gift Gifts[MAX_CHILD];
typedef struct{
String name;
int grade;
Gifts asked; //gifts the child asked for
int n_asked;
} Child;
typedef Child Children[MAX_CHILD];
Data make_data (String line){
Data d;
sscanf(line,"%s %d %s %d", d.child_name, &d.grade, d.gift_name, &d.price);
return d;
}
Child make_child(Data d) {
Child c;
strcpy(c.name, d.child_name);
c.grade = d.grade;
c.n_asked = 0;
return c;
}
Gift make_gift(Data d){
Gift g;
strcpy(g.name, d.gift_name);
g.price = d.price;
g.received = false;
return g;
}
int process(char file_name[]){
Line line;
FILE *f = fopen(file_name, "r");
while(fgets(line, MAX_LINE, f) != NULL){
make_data(line);
}
int fclose (FILE *f);
}
int main(){
process("data.txt");
return 0;
}
所以这个程序接收到这种格式的文件文本:
John 4 Bike 200
Alice 3 Computer 800
Alice 3 Candy 10
Mike 5 Skate 100
并在函数process中构造数据。
问题是,我想将所有孩子存储在数组 Children[] 中并打印它(打印所有数组或类似于 Children[0]、Children[1] 等的东西)。我尝试了一些方法,但没有成功......因为数组是儿童类型而不是 char*。即使我只是做Children cs;,我也会遇到分段错误。有没有办法我可以做到这一点?
我的第二个问题是,最初我有#define MAX_CHILD 20000,当我尝试编译时,我收到一个错误,提示“数组‘Children’的大小太大”。为什么会这样?我看到它不会发生在 Gifts 上,但会发生在 Children 身上,因为结构 Child 具有与成员一样的 Gifts 类型,这意味着它需要更多空间。
任何帮助表示赞赏。
【问题讨论】:
-
关于“太大”错误,请参阅:stackoverflow.com/questions/18371584/…
-
OP 可以通过在文件空间而不是堆栈中声明数据来消除“太大”的问题。
-
函数:process() 将导致编译器针对具有非空返回缺少实际返回语句的函数发出警告。 (为什么发布您知道无法编译的代码?)您正在启用所有警告?警告不容忽视。
-
这不是帕斯卡编程。所以使用函数原型并使用 main() 函数“打开球”。在处理包含数千个文件和数百万行代码的应用程序时,良好的编程实践和良好习惯将为您提供支持
-
@user3629249 这段代码可以编译。所有的结构都给了我(正如我提到的,这是一个练习),我只需要构建 process() 函数,唯一缺少的就是构建 Children 数组,正如我所说的。