-2

私の入力ファイルには、次のような多くの行があります。

ATOM 339 OP1 DG D 218 72.270 54.958 23.040 1.00 27.52 O  

72.270 54.958 23.040すべての行から3つの座標を抽出したいと思い ます。すべての行を文字列として保存し、以下を使用して座標を抽出しました。

sscanf(protein[j].c_str(),"%s %s %s %s %s %s %f %f %f",useless1,useless2,useless3,useless4,useless5,useless6,&xCord,&yCord,&zCord);

ここでは、文字列の名前はすべて役に立たない。これにより、多くの警告とプログラムのクラッシュが発生します。

warning: format '%s' expects type 'char*', but argument 6 has type 'int'.          
warning: cannot pass objects of non-POD type 'struct std::string' through '...'; call will abort at runtime.

何が問題ですか?

また、入力char配列に1つではなく複数のスペースがある場合、sscanf()はクラッシュしますか?(このエラーの可能性を排除するために、入力ファイルの複数のスペースを削除しました。)

編集:私はそれらが最初にintであるというこの可能性をチェックしました。(私はそれほど大きな初心者ではありません。)これは最初のコードです:

string str,useless1,useless2,useless3,useless4,useless5,useless6,useless7,useless8,useless9;
4

2 に答える 2

4

何が問題ですか?

コンパイラはそれが何であるかを教えてくれました。

format'%s'はtypeを期待します'char *'が、引数6はtypeを持ち'int'ます。

したがって、文字列の6番目の形式指定子は、scanf()を期待するように指示しchar *ますが、int代わりに渡します。

非PODタイプのオブジェクトを通過させることはできませ'struct std::string''...'

これは、C ++オブジェクト(より正確には、単純な古いデータ型ではない変数)を可変個引数関数に渡すことができないことを意味します。そして、あなたはそれをやろうとしています。そしてそれはあなたにそれが壊れるであろうとさえ警告します。


他のコメント:

  1. C ++では、C関数を使用することはめったに推奨されません。std::cinあなたは一般的に他に固執する必要があります。より良いスタイルのために。

  2. ただし、上記のすべてにもかかわらず、C関数の使用を主張する場合は、貧弱なままにしておいてscanf()ください。とにかく、あなたが思っていることはしません。を使用してユーザー入力の行を取得し、または関数の一部を使用して、またはをfgets()使用して解析します。std::stringstream<cstring><string.h>

于 2013-03-10T19:56:12.550 に答える
0

エラーは、引数6がuseless6intではなくintであることを示していますchar *

このリファレンスは、非PODを可変個引数関数に渡すことができない理由を説明しています

于 2013-03-10T19:56:44.340 に答える