2009-03-06 7 views
2

私はgetopt_longを使ってC++アプリケーションでコマンドライン引数を処理しています。これらの例はすべて処理例にprintf("Username: %s\n", optarg)のようなものを示しています。これは例を示すのに最適ですが、後で使用するために値を実際に格納できるようにしたいと考えています。コードの残りの部分の多くはchar*の代わりにstringオブジェクトを使用していますので、optargの内容を文字列にキャスト/コピーする必要があります。optargをC++文字列オブジェクトとして取得

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のを使用してバーの値をプリントアウトしようとした場合、私は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を実行していましたが、このエラーの結果として生じる膨大なメモリエラーのため、このエラーの原因を正確に突き止めることが困難でした。

答えて

7

あなたは、%sを指定するときにCスタイルの文字列(nullで終わる文字の配列)を提供していたが、代わりに文字列クラスを指定したとしました。あなたがのstd ::文字列トライを使用していると仮定すると:

printf("bar : %s\n", bar.c_str()); 
6

printf()はC++ string Sを処理することはできません。代わりにbar.c_str()を使用してください。

+0

私はこれを覚えておくべき重要なことのリストに入れなければならないと思います。ありがとう! –

3
cout << " bar: " << bar << "\n"; 

は完全に安全です。あなたはそれがそうではないと思いますか?

+0

それが実行されるだけで、安全であるとは限りません。 :)特に同じオブジェクトを使用しているときに別のメソッドが死ぬように見える場合は特にです。 –

関連する問題