不知道我是怎么得到这个错误的〜> C

时间:2013-10-20 14:34:35

标签: c debugging

所以,我有一些代码逐行读取文件 这是代码

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

typedef struct alumnus {

    int *yearGraduated;
    char firstName[30];
    char lastName[30];

} Alumns;

void printer ( Alumns *a ) {

    printf("Year: %*d", a->yearGraduated);
    printf("  First Name: %s", a->firstName);
    printf("  Last Name: %s", a->lastName);

}

int main(int argc, const char * argv[])
{
    Alumns a;
    char *home = getenv("HOME");
    char path[100] = "/Desktop/Alumni.txt";
    strcat(home, path);
    FILE *fp;
    fp = fopen(home, "r");

    while ( fp ) {

     fscanf(fp, "%d,%s,%s", a.yearGraduated, a.firstName, a.lastName);
     printer(&a);
    }

    return 0;

}

我在打印机功能中遇到错误@第2行

printf("Year: %d", a->yearGraduated);

我的IDE对此行说了以下内容:
    Format指定类型'int'但参数的类型为'int *'

编译代码时才会出现另一个错误。错误在线:

a.yearGraduated, a.firstName, a.lastName);

我的IDE说明了这一点:
线程1:EXC_BAD_ACCESS(代码= 1,地址= 0x0)

是的,文件存在,是的,它的格式正确。
关于如何调试的任何想法?
我被建议使结构中的int不是指针,但我不确定。

2 个答案:

答案 0 :(得分:2)

yearGraduated是一个指针。您需要为它分配空间并在printf语句中取消引用它。

因此...

 a.yearGraduated = malloc(sizeof(int));

 fscanf(fp, "%d,%s,%s", a.yearGraduated, a.firstName, a.lastName);

 free(a.yearGraduated);

并在函数中

 printf("Year: %d", *a->yearGraduated);

或者你可以使结构中的int不是指针而且它不会成为问题。

答案 1 :(得分:1)

关于第一个错误:您需要的所有信息都在错误消息中。您提供指向int的指针,其中printf期望int。除非您有理由将yearGraduated作为指针,否则应将其更改为int

typedef struct alumnus{
    int yearGraduated;
    ...
} Alumns;

如果您这样做,则需要将第一个参数更改为fscanf以传递a.yearGraduated&a.yearGraduated的地址。

如果你选择将它作为指针,你必须分配它:

Alumns a;
a.yearGraduated = malloc(sizeof a.yearGraduated);

然后在打印机中,您必须将其取消引用至printf

printf("Year: %*d", *a->yearGraduated);

代码在fscanf崩溃的原因是因为a.yearGraduated的内存未分配,因此fscanf尝试写入未分配的内存,这是一个坏主意。

ADD :(回复您的评论)

程序永远循环的原因是因为while(fp)将永远循环(除非fopen失败,在这种情况下它根本不会循环)。我假设你的推理是当到达流的末尾时fp将变为假。但是fp只是一个(指针)值而fscanf不会(不能)改变它。要在到达流末尾时停止循环,请使用feof