2012-03-17 9 views
0

sscanfを使用してリストから時間と分をスキャンするのに苦労しています。以下はリストの小さな抜粋です。どのように私は時間をsscanですか?

1704 86 2:30p 5:50p Daily 
1711 17 10:40a 2:15p 5 
1712 86 3:10p 6:30p 1 
1731 48 6:25a 9:30a 156 
1732 100 10:15a 1:30p Daily 
1733 6 2:15p 3:39p Daily 

私はこれを試しましたが、セグメント化エラーが発生しています(この情報を構造体に入れています)。

for(i=0;i<check_enter;i++){ 
    sscanf(all_flights[i], 
    "%d %d %d:%d%c %d:%d%c %s", 
    &all_flights_divid[1].flight_number, 
    &all_flights_divid[i].route_id, 
    &all_flights_divid[i].departure_time_hour, 
    &all_flights_divid[i].departure_time_minute, 
    &all_flights_divid[i].departure_time_format, 
    &all_flights_divid[i].arrival_time_minute, 
    &all_flights_divid[i].arrival_time_minute, 
    &all_flights_divid[i].arrival_time_format, 
    &all_flights_divid[i].frequency); 

    printf("%d ",all_flights_divid[i].flight_number); 
    printf("%d ",all_flights_divid[i].route_id); 
    printf("%d ",all_flights_divid[i].departure_time_hour); 
    printf("%d ",all_flights_divid[i].departure_time_minute); 
    printf("%c ",all_flights_divid[i].departure_time_format); 
    printf("%d ",all_flights_divid[i].arrival_time_hour); 
    printf("%d ",all_flights_divid[i].arrival_time_minute); 
    printf("%c ",all_flights_divid[i].arrival_time_format); 
    printf("%s\n",all_flights_divid[i].frequency); 
    } 

これは私がそれを宣言した方法です。

struct all_flights{ 
    int flight_number; 
    int route_id; 
    int departure_time_hour; 
    int departure_time_minute; 
    char departure_time_format; 
    int arrival_time_hour; 
    int arrival_time_minute; 
    char arrival_time_format; 
    char frequency[10]; 
}; 
struct all_flights all_flights_divid[3000]; 

これらは私が

0 86 2 30 p 0 50 p Daily 
0 17 10 40 a 0 15 p 5 
0 86 3 10 p 0 30 p 1 
0 48 6 25 a 0 30 a 156 
0 100 10 15 a 0 30 p Daily 
0 6 2 15 p 0 39 p Daily 
+3

all_flights_dividの宣言を指定しておく必要があります。引数リストにアンパサンドがいくつか欠落しているようです。 'all_flights_divid [i] .arrival_time_format、...'ヒント:各引数の前に新しい行を追加すれば、見やすくなります。 – stacker

+0

私はちょうど私の質問を更新しました。 –

+0

問題はフィールド "timeformat"> all_flights_divid [i] .departure_time_formatである可能性があります。それは、departure_time_formatがstructで > char departure_time_format [2]と宣言されている場合にのみ機能します。 charの配列)あなたのscanfにはこのようなポインタが必要です。 >&all_flights_divid [i] .departure_time_format(そして、到着時間と同じ原因となる) – Soren

答えて

2

を得る結果では、sscanf関数で出力ターゲットのリストで十分に確認してください。 &all_flights_divid[i].departure_time_minuteall_flights_divid[i].departure_time_formatの違いは分かりますか? .arrival_time_format.frequencyの場合も同様です。

&アンパサンドについてはどう思いますか?ヒント:単一の関数呼び出しから複数の値を返す方法の1つは、&のアンパサンドとは何でしょうか?

セグメンテーションエラーは、プログラムがオペレーティングシステムがプログラムに使用可能にするようにCPUに指示していないメモリにデータを書き込もうとすると発生します。データが誤って配置されていると、セグメンテーションフォルトが発生しない場合があります。データが誤って配置されることがあるため、内には、があります。あなたが誤って本を誤って本棚の間違った場所に置くと、後でその本をすぐに見つけることはできませんが、本はまだ本棚にあり、誰にも見えないように見えます。一方、あなたが誤って同じ本を冷蔵庫に入れた場合、母親が牛乳を摂取すると、セグメンテーション違反が発行されます。それはとにかく類推です。一般的に

は、(冷蔵庫の中に置き忘れたように)かない(本棚に見当違いのように)あなたがプログラムを実行するまで、データをなくすことは、セグメンテーションフォルトが発生するかどうかを推測するのは難しいです。セグメンテーションフォールト(冷蔵庫)は、間違いを明らかにするため、オペレーティングシステムは可能な限り小さなメモリとしてプログラムを提供することでできるだけ多くのセグメンテーションフォールトを提供しようとします。

あなたの「宿題」タグのために100%の直接回答を避けることにしています。もしあなたが&のアンパサンドの問題を理解できないかどうかを見て、まだそれが理にかなっていなければここに戻ってください。

+0

私はあなたがintにリンクさせたいときにのみ '&'を使うと思っていました。フォーマットは文字です。 –

+0

私は&を追加しました。 –

+2

まあ、Cでは、charsはただ1バイトのunsigned intsです。また、C言語のポインタを使いこなす場合は、&と*演算子が何をするのかを強く意識する必要があります。さもなければ、あなたはこの問題をたくさん持ちます。 – FrankieTheKneeMan

0

あなたのポインタはすべて台無しです。おそらく、このようなものを読み込むための一連のローカル変数が、あなたの頭の中でこれを整理するのに役立つでしょう。

+0

これは本当に不要です。それは維持することがさらに困難になります。あなたはコードにさらに多くの問題を導入しました... –

+0

おそらく、不必要なことですが、実際に何が起こっているのかを知るのに役立ちます。そして、コードを維持することをより困難にするものではありません。何があっても、ここで読み込まれている変数をすばやく読み取ることができるため、コードの実行が簡単になります。そして私は答えを過負荷にしたくないので、必要なメモリ管理をすべて避けました。 – FrankieTheKneeMan