2016-08-17 15 views
1

CSVファイルから10行を読み込み、名前とグレードを分けたいプログラムに取り組んでいます。私はここに提供されたドキュメントを使用しましたReading values from CSV file into variablesCSVファイルから行を読み込み、値に分割する(sscanf SIGSEGV)

残念ながら、私のコードはsscanfステートメントでラインに来るときSIGSEGVをスローします。私はと%fの間の,を削除しようとしましたが、その後は動作しますが、目的を破るグレードではなく名前のみが取得されます。

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

int main() { 
    char str[10][30], names[10][20]; 
    FILE *fp; 
    int i; 
    float grades[10]; 

    fp = fopen("names.txt", "rt"); 

    for (i = 0; i < 10; i++) { 
     fgets(str[i], 30, fp); 
     sscanf(str[i], "%[^,], %f", &names[i], grades[i]); 
     printf("%s ", names[i]); 
     printf("%f ", grades[i]); 
    }; 
} 

これはcsvファイルの内容です:

Bob,8 
Carla,7 
Jack,5 
Julie,3 
Goncalo,9 
Vera,6 
Jesse,8 
James,8 
Francis,10 
Monica,6 

は、あなたが他のどの情報が必要かどうか尋ねることを躊躇しないでください、あなたの助けをいただき、ありがとうございます。

+0

これは機能しましたが、アンパサンドはなぜ必要ないのですか?他のスレッドではそこにいましたか? – Casz146

+0

私は、迅速な答えをありがとう! – Casz146

答えて

1

あなたsscanfへの引数は、そのあるべき、間違っています:

sscanf(str[i], "%19[^,], %f", names[i], &grades[i]); 

names[i]char配列であるので、あなたはそのアドレスを渡すべきではありませんが、&names[i][0]かのどちらかであるその最初の要素のアドレス単にnames[i]。逆はfloatである。そのアドレスを&grades[i]またはおそらくgrades + iとして渡す必要がありますが、読みにくいです。

そして、入力文字列が正しく変換されたことを確認するために戻り値を確認する必要があります。

forブロックの末尾に余分な;も削除してください。

関連する問題