2017-03-31 32 views
0

だから私は、テキストファイルから読み込むと、私はstrsep/strtokは聞いたファイルから設定を読み込む

NAME= Bame 
GAME= Fame 

があるテキストファイルに変数

に入れしようとしていますしかし、私はまだ問題を抱えていると、このコードで私は取得セグメンテーションフォールト主な問題は、このラインからである11

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

int main() { 
char *token; 
char *string; 
char *tofree; 
FILE *fp; 
const char *file = "/tmp/test.txt"; 
fp = fopen(file, "r"); 
while(!feof(fp)) { 
fgets(string, sizeof(string), fp); 
token = strsep(&string, ","); 
printf("%s", string); 
} 
fclose(fp); 
exit(0);  
} 
+3

'char * string;'は_文字列ではありません。これは、初期化されていないので、「どこにもない」を指し示す 'char'へのポインタです。この初期化されていないポインタに書き込み、UBを呼び出します。したがって、クラッシュ。文字配列を使って修正してください: 'char string [100];' [なぜwhile(!feof(file))が常に間違っているのですか?](http://stackoverflow.com/questions/5431941/why-is-while-feof-file-always-wrong)も参照してください。したがって、あなたの 'feof'を' fgets'で置き換えてください。 –

+1

'fp = fopen(file、" r "); – LPs

+0

も参照してください。[なぜwhile(!feof(file))が常に間違っているのですか?](http://stackoverflow.com/questions)/5431941/why-is-feof-file-always-wrong) –

答えて

1

fgets(string, sizeof(string), fp); 

第2パラメータは'Maximum number of characters to be copied into str'である必要があります。この関数を呼び出す前に、stringを初期化しておく必要があります。私が与えたリンクの例を見ると、stringを文字配列に変更すると、より多くの文字を進めることができます。

char string[100]; 
.... 
fgets(string, 100, fp);  

以前は文字列が実際にポインタ型であったがため、sizeof(string)を集め、あなたは(プラットフォームに応じて4または8のいずれか)バイトポインタの大きさを集めています。 stringも割り当てられていないポインタなので、fgetsはランダムなメモリアドレスに書き込んでいる可能性があります。

関連する問題