Scanf导致段错误

时间:2015-10-03 19:33:43

标签: c segmentation-fault

我有一个文本文件:

In 0 John 66
In 1 May 77
In 0 Eliz 88
Out 0
Out 0

我尝试使用scanf解析此文本文件,并且此时在" In"之后发送值。添加功能,但是在尝试执行此操作时我遇到了段错误。

我在这里有一些代码: 单独头文件中的结构:

typedef Officer test;

typedef struct {
    test tests[6];
    int s;
} copList;

这一个:

typedef struct {
    char name[25];
    int id;
} Officer;

然后我有我的主要方法

int main(void) {
    FILE * ptr;
    char buffer [500];
    char * temp;
    int pos;
    int grade;
    char * name;
    copList * L;


    ptr = fopen("test.txt","r");
    if(ptr == NULL) 
        exit(1);


    temp = malloc(sizeof(char)*10);
    name = malloc(sizeof(char)*10);
    L = malloc(sizeof(copList));

    while(fgets(buffer,500,ptr) != NULL) {
        sscanf(buffer,"%s %d %s %d\n",temp,&pos,name,&grade);
        add(L->tests[pos],pos,L); //this gives me a seg fault
    }


    free(name);
    free(temp);
    free(L);
    fclose(ptr);
    return 0;
}

在一个单独的c文件中,我有添加功能。(无法更改)

void add(Test b, int pos, copList * L) {
//code to be added here later...
}

我尝试过分配不同数量的内存,但这并没有帮助。另外我注意到如果我将一个值设置为pos,在while循环中,在添加函数调用之前,我没有得到段错误,但显然这不是我想要的,因为值不会&# 39;改变。任何帮助将非常感激。

2 个答案:

答案 0 :(得分:2)

我看到你的代码的主要问题是它没有检查sscanf的返回值 - 如果sscanf返回2或4以外的东西,这意味着你的输入不是你说的那样是。此外,数组tempname可能会溢出(在您显示的输入之外的输入上),这会导致未定义的行为。最后,\n格式的空格和sscanf是错误的,应该删除(尽管在这种情况下它们实际上不应该导致任何问题。)

所以你的代码应该是这样的:

while(fgets(buffer,500,ptr) != NULL) {
    int count = sscanf(buffer,"%9s%d%9s%d",temp,&pos,name,&grade);
    if (count != 2 && count != 4) {
        fprintf(stderr, "Invalid input line: %s", buffer);
        continue; }
    ... do stuff with temp and pos (only use name and grade if count == 4)

答案 1 :(得分:0)

在这一行:

add(L->tests[pos],pos,L);

第一个参数是'test'结构的副本。

传递整个结构几乎总是一个坏主意。将指针传递给结构体更好:

add( &(L->tests[pos]), pos, L );

然后,这一行有几个问题:

void add(Test b, int pos, copList * L) {

1) 'Test' is a non-existent type, perhaps you meant: 'test'
2) 'b' is expecting a passed struct.  as mentioned above,
   it is (almost) always better to pass a pointer to a struct.