optargをC ++文字列オブジェクトとして取得
-
03-07-2019 - |
質問
C ++アプリケーションでgetopt_longを使用してコマンドライン引数を処理しています。すべての例は、処理例で printf(" Username:%s \ n&quot ;, optarg)
のようなものを示しています。これは例を示すのに最適ですが、後で使用するために値を実際に保存できるようにしたいと考えています。残りのコードの多くは、 char *
ではなく string
オブジェクトを使用するため、optargの内容を文字列にキャスト/コピー/する必要があります。
string bar;
while(1) {
c = getopt_long (argc, argv, "s:U:", long_options, &option_index);
if (c == -1) break;
switch(c)
{
case 'U':
// What do I need to do here to get
// the value of optarg into the string
// object bar?
bar.assign(optarg);
break;
}
}
上記のコードはコンパイルされますが、printfを使用してbarの値を出力しようとすると、実行時に Illegal instruction
エラーが発生します(coutでは正常に機能するようです)。
// Runs just fine, although I'm not certain it is actually safe!
cout << " bar: " << bar << "\n";
// 'Illegal instruction'
printf(" bar: %s\n", bar);
コマンドラインデバッグについては、違法な命令が何であるかをよりよく掘り下げるほど十分に知りません。 valgrindを実行していましたが、このエラーに起因する大量のメモリエラーにより、このエラーの原因を正確に特定することは困難でした。
解決
%sを指定するときに、cスタイル文字列(nullで終わる文字の配列)を供給することをprintfに伝えましたが、代わりに文字列クラスを提供しました。 std :: string try:
を使用していると仮定しますprintf("bar : %s\n", bar.c_str());
他のヒント
printf()
はC ++の string
を処理できません。代わりに bar.c_str()
を使用してください。
cout << " bar: " << bar << "\n";
は完全に安全です。なぜそうではないと思うのですか?
所属していません StackOverflow