0

ここでのポイントを完全に見逃している可能性がありますが、Visual Studio の cpp プログラムで引数を出力する次の方法があります。

int _tmain(int argc, char* argv[])
{

    char* fu = "Bar";

    std::cout << "Test, " << argc << ", " << argv[0] << ", " << argv[1] << ", " << fu << endl;
        printf("%s, %s, %s", argv[0], argv[1], fu);
    return 0;
}

私が抱えている問題は、文字列全体ではなく、引数の最初の文字のみを出力するように見えることです。

私が知る限り、argv[0] は argv 配列を逆参照して char* を取得します。これが cout/printf 関数に渡されます。次に、\0 文字までのすべての文字を出力する必要があります。

テスト char* fu を作成して、関数に char* を渡すことに問題があるかどうかを確認しましたが、'Bar' が正常に出力されました。

私が考えることができる唯一のことは、コンパイル時に fu のサイズがわかっているためであり、argv のサイズはコンパイルされた方法で何かおかしいことではないということです。

文字をループすることで内容を印刷できることはわかっていますが、これはポイントを無効にしているようです。たとえば、比較のために文字列を操作したい場合などです。誰かが何が起こっているのか説明してもらえますか?

4

2 に答える 2

2

に変更_tmainするか、とにmain変更charしてください。ベースの機能を一貫して使用するか、まったく使用しないでください。TCHARprintf_tprintfTCHAR

Unicode ビルドをビルドしていることは明らかであり、渡されるパラメーターはwchar_t*ではなくポインターchar*です。それらをあたかも であるかのように扱うことによりchar*、プログラムは未定義の動作を示します。

于 2013-08-10T17:44:48.863 に答える
1

問題は、おそらく Uni-Code 文字セットを使用していることです。そのため、1 文字あたり 16 ビット (ワイド文字) であると想定されます。ただし、解析された文字は 8 ビットのみであるため、下位 8 ビットを 16 ビット領域に配置します。そして、残りの 8 ビットを解放します。したがって、アプリケーション内では、それを幅のない文字配列として扱い、バイトごとに読み取るため、最初の8ビットを取得し、2回目は初期化されていないブロックから読み取っています。これはおそらくちょうど0000です0000 (あなたのケースでは '\0' トークンを設定するもの) しかし、何かを入れていないので、何でもかまいません。

この問題を解決する最善の方法は、(ワイド文字を使用することが想定されていない限り) MSVC プロジェクトのプロパティに移動し、[一般] -> [文字セット] で [ユニコードを使用する] の代わりに [マルチバイト文字セットを使用する] を選択することです。 . 次に、メインの名前を「メイン」に変更するだけで、質問の範囲内で機能するはずです。

于 2013-08-11T15:24:51.037 に答える