为什么我的编辑器不能识别我的typedef结构? C

时间:2013-10-27 19:08:00

标签: c arrays struct structure typedef

新问题:我必须将文件中的数据读入结构数组,并且我的scanf函数出错了。我真的不确定扫描结构的细节。这就是我写的:

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

#define runnum 500
#define charnum 20

typedef struct {
        unsigned long bibnum;
        char lastname[charnum];
        char fistname[charnum];
        int grade;
        char team[charnum];
        char state[charnum];
        int time1;
        float time2;
    } runner_t;

int main(void)
{
    int i;
    FILE *ifile, *jfile;

    ifile = fopen("20121006.boys.txt", "r");
    jfile = fopen("20121006.girls.txt", "r");

    runner_t runarray[runnum]; 

    i = 0;

    while  (i < runnum)
        {
            scanf(ifile, "%ul", &runarray[i].bibnum);
            scanf(ifile, "%s", &runarray[i].lastname);
            scanf(ifile, "%s", &runarray[i].firstname);
            scanf(ifile, "%d", &runarray[i].grade);
            scanf(ifile, "%s", &runarray[i].team);
            scanf(ifile, "%s", &runarray[i].state);
            scanf(ifile, "%d", &runarray[i].time1);
            scanf(ifile, "%f", &runarray[i].time2);
        printf("%d %s %s %d %s %s %d:%f", runarray[i].bibnum, runarray[i].lastname, runarray[i].firstname, runarray[i].grade, runarray[i].team, runarray[i].state, runarray[i].time1, runarray[i].time2); 
        i++;
     }

3 个答案:

答案 0 :(得分:0)

编辑问题纯粹是装饰性的。你可以试试这个:

typedef struct runner_t {
    // ...
} runner_t;

请注意,虽然在POSIX系统(如Mac OS X和Linux)上保留了_t后缀。最好是使用_type代替,或者根本不使用后缀。

虽然你的问题(编译错误)存在于其他地方。首先,您使用scanf()代替fscanf()scanf()始终从stdin流中读取并且没有FILE*参数(因此当您尝试传递FILE*作为第一个参数时,编译器会将其视为错误,因为它始终需要const char*。)要从您自己的文件流中读取,您需要使用fscanf(),它确实采用FILE*参数。 E.g:

fscanf(ifile, "%lu", &runarray[i].bibnum);

注意:它是%lu,而不是%ul。)

另请注意,当您读入字符串时,即使它们已经是指针,您也会将指针传递给它们:

fscanf(ifile, "%s", &runarray[i].lastname);

由于runner_t.lastname已经是一个指针,只需按原样传递:

fscanf(ifile, "%s", runarray[i].lastname);

此外,您在结构声明中拼错了runner_t.firstname。你将它命名为fistname。改变它。

最后,在printf()中,您使用%d作为格式说明符来打印bignum。由于它是unsigned long,因此您需要使用%lu

答案 1 :(得分:0)

您的结构代码没问题,如果您不相信,请参阅this。那个ideone.com代码片段只添加了这个主要功能,并且工作正常:

int main(void) {
  runner_t foo;
  printf ("sizeof foo is %zu\n", sizeof foo);
  return 0;
}

请参阅http://sscce.org以获取有关如何避免针对疑问提出问题的良好建议......


编辑后:使用fscanf,因为scanf不会将FILE*作为第一个参数(检查两者的文档)。始终检查任何scanf系列的返回值 功能。同时检查fopen的返回值是否有错误。

此外,在为& fscanf传递数组时,请勿使用%s。数组的名称表示数组的地址,并且取&的数组是没有意义的,并且是不允许的。例如:fscanf(ifile, "%s", runarray[i].state);

答案 2 :(得分:0)

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

#define RUNNUM 500
#define CHARNUM 20

typedef struct {
        unsigned long bibnum;
        char lastname[CHARNUM];
        char firstname[CHARNUM];
        int grade;
        char team[CHARNUM];
        char state[CHARNUM];
        int time1;
        float time2;
    } runner_t;

int main(void)
{
    int i;
    FILE *ifile, *jfile;

    ifile = fopen("20121006.boys.txt", "r");
    jfile = fopen("20121006.girls.txt", "r");

    runner_t runarray[RUNNUM];

    for (i=0; i < RUNNUM; i++)
        {
            fscanf(ifile, "%lu", &runarray[i].bibnum);
            fscanf(ifile, "%s", runarray[i].lastname);
            fscanf(ifile, "%s", runarray[i].firstname);
            fscanf(ifile, "%d", &runarray[i].grade);
            fscanf(ifile, "%s", runarray[i].team);
            fscanf(ifile, "%s", runarray[i].state);
            fscanf(ifile, "%d", &runarray[i].time1);
            fscanf(ifile, "%f", &runarray[i].time2);
        printf("%lu %s %s %d %s %s %d:%f"
        , runarray[i].bibnum
        , runarray[i].lastname, runarray[i].firstname
        , runarray[i].grade, runarray[i].team
        , runarray[i].state
        , runarray[i].time1, runarray[i].time2);

     }
return 0;
}

在这里编译。