2016-08-23 8 views
0

I)は、(関数fscanfを使用してファイルから行を読み込むしようとしています:)(関数fscanfを使用して行を読み込む

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
    FILE *fp; 
    char c, *string[4]; 
    int i = 0,j[4]; 
    fp = fopen("boil.txt", "r"); 
    c = fgetc(fp); 
    if(fp == NULL) 
    { printf("File read error\n"); 
     exit(0); 
    } 

    while(c != '\n') 
    { 
     fscanf(fp, "%s %d ", string[i] , &j[i]); 
     i++; 
     c = fgetc(fp); 
    } 
    for(i = 0; i < 4; i++) 
    { 
     printf("%s  %d\n", string[i], j[i]); 
    } 
} 

boil.txtは以下の通りです:

boil 4 boilmilk 3 boilwater 5 heat 10 

このプログラムはなぜセグメンテーションフォルトを与えるか?

+6

、あなたの '文字列[i]は'ポインタがランダムな場所を指します。 –

+1

ここでも注意してください.fgetcとfscanfはどちらも先にファイルポインタを移動します。あなたが望む文字が得られていない可能性があります。 – crlanglois

+1

1)エラーチェックなし2) 'fgetc'は正当な理由で' char'ではなく 'int'を返します。 3)割り当てられたスペースはありません。 4)など5)[ask]を参照してください。 – Olaf

答えて

5

あなたはこのような文字列のためのスペースを確保していないので:

char *string[4]; 

は、文字列へのポインタの配列ですが、あなたは、これらの文字列を格納するようなものの部屋を必要とする:

char temp[256]; 

fscanf(fp, "%s %d ", temp , &j[i]); 
string[i] = strdup(temp); 

EDITを:

strdupを使用できない場合、strdupを使用できない場合、strdupは標準の一部ではありませんが(多くの実装で利用可能です)、iRoveから指摘されていますが、

あなたがメモリを割り当てる必要が
string[i] = malloc(strlen(temp) + 1); 
if (string[i] == NULL) { 
    perror("malloc"); 
    exit(EXIT_FAILURE); 
} 
strcpy(string[i], temp); 

(文字列が不要になっている場合)、最後に自由を呼び出していないことを忘れてはいけない

for (i = 0; i < 4; i++) free(string[i]); 
+3

'strdup()'は実際にはISO C標準の一部ではないことに注意してください。 – iRove

+1

iRove:良い点が編集されました。 –

+1

これを考慮していただきありがとうございます。 :-) – iRove

関連する問題