2

C++ アプリケーションでコマンド ライン引数を処理するために getopt_long を使用しています。例はすべてprintf("Username: %s\n", optarg)、処理例のようなものを示しています。これは例を示すのに最適ですが、後で使用するために値を実際に保存できるようにしたいと考えています。コードの残りの部分の多くはstring代わりにオブジェクトを使用しchar*ているため、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;
        }
}

上記のコードはコンパイルされますが、実行時にIllegal instructionprintf を使用して bar の値を出力しようとするとエラーが発生します (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 を実行していましたが、このエラーが原因で大量のメモリ エラーが発生したため、このエラーの原因を正確に特定することが困難でした。

4

3 に答える 3

7

%s を指定するときに ac スタイルの文字列 (null で終了する文字の配列) を提供していると printf に伝えましたが、代わりに文字列クラスを提供しました。std::string を使用していると仮定して、次を試してください。

printf("bar : %s\n", bar.c_str());
于 2009-03-06T00:54:17.797 に答える
6

printf()C++ を処理できませんstringbar.c_str()代わりに使用してください。

于 2009-03-06T00:55:51.227 に答える
3
cout << " bar: " << bar << "\n";

は完全に安全です。そうではないかもしれないと思う理由は何ですか?

于 2009-03-06T01:12:38.860 に答える