我有一个文本文件:
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;改变。任何帮助将非常感激。
答案 0 :(得分:2)
我看到你的代码的主要问题是它没有检查sscanf
的返回值 - 如果sscanf返回2或4以外的东西,这意味着你的输入不是你说的那样是。此外,数组temp
和name
可能会溢出(在您显示的输入之外的输入上),这会导致未定义的行为。最后,\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.