0

これが私のコードです:

    while (fgets(line, 1000, fp) != NULL) 
    { 
      printf("backin!");
      if ((result = strtok(line,delims)) == NULL)
        printf("Need from_id, to_id, and distance on each line of input file.\n");
      else
        from_id = atoi(result);
      printf("check!\n");
      if ((result = strtok(NULL,delims)) == NULL)
        printf("Need from_id, to_id, and distance on each line of input file.\n");
      else
        to_id = atoi(result);
      printf("check!\n");
      if ((result = strtok(NULL,delims)) == NULL)
        printf("Need from_id, to_id, and distance on each line of input file.\n");
      else
        distance = atof(result);
      printf("check!\n");
      printf("from_id: %d, to_id: %d, distance: %f",from_id, to_id, distance);
      if(BuildGraph(graph_array, from_id, to_id, distance) == -1)
        printf("Error while filling in graph type"); 
      printf("check!\n");
    }

これらすべての printfs は、segfault が発生した場所を特定するためのものです。入力ファイルの長さは 100 行で、この関数は 15 回動作し、すべてのチェックを完了してから、"backin!" の前にエラーをセグメント化します。16回目の繰り返しで印刷されます。

入力ファイルを調べたところ、怪しいものは何もありません (間違いなく 1000 文字未満です)。fgets に問題があるようですが、何がわかりません。

4

2 に答える 2

2

のサイズがline1000 文字以上であることを確認するか、コードを次のように変更します。

while (fgets(line, sizeof(line), fp) != NULL) 
...

line最長の行を保持するのに十分な大きさにするか、部分的な行を処理するロジックを用意する必要があります。

于 2012-11-16T04:47:28.493 に答える
0

正規表現を使用して fscanf を試すことができます"%[^\n]s"。これにより、行末文字まですべてのトークンが受け入れられます。

  • 質問とは関係ありませんが、printf の後に getch() を使用する練習をしてください。
于 2012-11-16T06:11:29.967 に答える