2013-04-26 70 views
2

我有一個程序,我正在寫其中我需要從平面文件中fgets一行。我然後sscanf行將數據放入一個結構。這給了我非常意想不到的結果。首先,這是一個與我想要做的相似的工作示例。我有一個文件department.in它看起來像下面這樣:fgets和sscanf與一個結構導致意外的結果

0 something 
1 else 
2 more 

這裏是一個運行,並給了我,結果我期望一個示例程序:

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

int main(void) 
{ 

    FILE *in; 
    in = fopen("department.in", "r"); 

    char * buffer = malloc(256 * sizeof(char)); 
    while((fgets(buffer, 256, in)) != NULL){ 

      int index; 
      char* name; 
      sscanf(buffer, "%d %s", &index, name); 

      printf("\n\nIndex: %d, Name: %s.\n\n", index, name); 
    } 

    free(buffer); 

    return 0; 
} 

正如預期的這個結果:

Index: 0, Name: something. 

Index: 1, Name: else. 

Index: 2, Name: more. 

然而,當我添加一個結構,它編譯罰款:

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

typedef struct{ 
    int index; 
    char* name; 
}test; 

int main(void) 
{ 

    FILE *in; 
    in = fopen("department.in", "r"); 

    char * buffer = malloc(256 * sizeof(char)); 
    while((fgets(buffer, 256, in)) != NULL){ 

      test *mytest = malloc(sizeof(test)); 

      sscanf(buffer, "%d %s", &mytest->index, mytest->name); 

      printf("\n\nIndex: %d, Name: %s.\n\n", mytest->index, mytest->name); 
      free(mytest); 
    } 
    free(buffer); 
    return 0; 
} 

的結果不是我所期望的:

Index: 0, Name: (null). 

Index: 1, Name: (null). 

Index: 2, Name: (null). 

顯然,我做我的字符的,但我爲我的生活不能弄清楚什麼不對勁。當我改變某些東西時,它甚至會將故障排除在外。任何幫助將不勝感激!

P.S.這不是功課。我剛剛爲我的實際代碼做了一個更簡單的示例,以便於閱讀和編譯,以及學習我需要的這個概念。再次感謝!

回答

2

將存儲分配給mytest->name。輸出告訴你指針是NULL。

mytest->name = malloc(256); /* sizeof(char) is always 1, by definition */ 

或者你可以用數組替換指針。

typedef struct{ 
    int index; 
    char name[256]; 
}test; 

順便說一句,做一個簡單的例子很好的工作。

+0

這是第二部分的工作!當然......我知道我錯過了一些東西。你如何正確地分配存儲到mytest->名稱? – 2013-04-26 00:45:37

+0

用示例編輯。 – 2013-04-26 00:55:29

+0

我不敢相信我沒有看到!謝謝 :) – 2013-04-26 01:14:42