2017-05-21 9 views
0

Iは、次の形式で入力を読み取るしようとしてX、Y、Kは、二値であり、Cはチャーであるクリーニングのscanfバッファ

XgYsKsC XgYsKsC 

。私は次のコード

scanf("%lf%*c%lf%*c%lf%*c", &L1g, &L1m, &L1s); 
scanf(" %c", &L1c); 

scanf("%lf%*c%lf%*c%lf%*c", &L2g, &L2m, &L2s); 
scanf(" %c", &L2c); 

double lat = (L1g * 3600 + L1m * 60 + L1s)/3600.0; 
double len = (L2g * 3600 + L2m * 60 + L2s)/3600.0; 

cout << setprecision(2) << fixed << lat << " " << len << endl; 

を使用してい

これは、最初の繰り返しで正常に動作しますが、2番目の1に、それは間違った値でcoutの2回を実行します。

だから、私は、次の入力を持つ2つのscanf

cout << L1g << " " << L1m << " " << L1s << " " << L1c << endl; 
cout << L2g << " " << L2m << " " << L2s << " " << L2c << endl; 

後にこのコードの2行を追加しました:私は次の出力を持っている

23g27m07sS 47g27m06sW 
23g31m25sS 47g08m39sW 

23 27 7 S 
47 27 6 W 
23.45 47.45 // all fine until here 
23.00 27.00 7.00 g // It should be printed 23 31 25 S 
31.00 25.00 6.00 S // It should be printed 47 8 39 W 
23.45 31.45 // Wrong Answer 
23.00 27.00 7.00 g // And it repeats without reading inputs 
8.00 39.00 6.00 W 
23.45 8.65 

私はそれを修正するいくつかの方法を試しましたが、うまくいきませんでした。私は何が欠けていますか?あなたの場合の問題点は、このフォームのための私の標準的なパターンがある

+3

常に 'scanf'の戻り値をチェックしてください。 – hyde

+3

C++でプログラミングしているのなら、なぜ 'scanf'を使っていますか?入力のエラーを処理したい場合は、[行全体を読む](http://en.cppreference.com/w/cpp/string/basic_string/getline)を[入力文字列ストリーム]に入れることをお勧めします。 (http://en.cppreference.com/w/cpp/io/basic_istringstream)、通常の "input"演算子 '>>'を使って行の解析を試みます。 'scanf'の使用を強くお勧めするなら、[最小、完全で、かつ実証可能な例](http://stackoverflow.com/help/mcve)を作成してください。 –

+0

Scanfはcinより高速ですが、プログラミングコンテストには本当に役立ちます –

答えて

0

...

while(fgets(buffer, sizeof(buffer), stdin) != NULL) { /* for each line */ 
    if(sscanf(buffer, "%lf%*c%lf%*c%lf%*c", &L1g, &L1m, &L1s) == 3) { 
     /* handle input which met first criteria. 
    } /* else - try other formats */ 
} 

、1 ....

while(fgets(buffer, sizeof(buffer), stdin) != NULL) { /* for each line */ 
    if(sscanf(buffer, "%lf%*c%lf%*c%lf%*c %lf%*c%lf%*c%lf%*c", &L1g, &L1m, &L1s, &L2g, &L2m, &L2s)) == 6) { 
     /* handle input which met first criteria. 
    } /* else - try other formats */ 
} 
に入力の2セットをバインドする方が簡単な場合があり

行を区切ることによって、データと解析状態の間の切断を制限します。 [s] scanfがスタックすると、予期せぬ文字が入力ストリームに残り、その後の読み込みを混乱させる可能性があります。

行全体を読み取ると、接続が1行に制限されます。 1つのscanf内のすべての行を読み取ることによって、一致するかどうかを判断できます。