2

私は C++ を学ぼうとしています。

このコードの最終結果は、char* argv[2]文字列のみを入力として受け取る関数に を出力し、変更された文字列を出力することです。

どうすればchar* argv[2]文字列に変換できますか?

私が試したことはすべて、何らかの理由でコマンドプロンプトをクラッシュさせてしまいます。

int main(int argc, char* argv[])
{
    std::string com2 = argv[2];
    char* com1[4];
    com1[1] = "-f";
    com1[2] = "--file";
    com1[3] = "-t";
    com1[4] = "--text";
    if (strcmp(argv[1], com1[1]) == 0) {

        cout << com2;
    }
}
4

3 に答える 3

6

配列インデックスはから0まで実行されますN - 1。ここNで、は配列内の要素の数です。したがって4、は無効なインデックスであり、未定義の動作になります。

argcの要素にアクセスする前に、の値をチェックして、正しい数の引数がプログラムに提供されていることを確認してくださいargv

于 2012-11-21T19:45:00.553 に答える
1

com1[4]は無効であり、未定義の動作になります。CおよびC++の配列は0ベースであるため、配列の有効なインデックスはになります0,1,2,3

于 2012-11-21T19:44:15.687 に答える
0

C および C++ のローカル変数は、(宣言されていない限りstatic) 実質的に常に自動です。つまり、それらはスタックに配置されます。スタックは下向きに成長し、配列はメモリ内で上向きに成長します。これら 2 つの組み合わせは、通常、スタック配列の最後の要素の後に何か重要なものがあり、それを超えて書き込むことは非常に危険であることを意味します (常に危険ですが、スタック配列の場合は非常に危険です)。com1[4]配列の末尾を過ぎた書き込みへの代入、インスタンスcom1の一部のデータ メンバーの上書き、または関数のスタック フレームの破棄(コンパイラがどのようにスタックに配置するかによって異なります)。std::stringcom2maincom1com2

引数を 1 つだけ指定してプログラムを開始すると、argv要素は 2 つしかなく、次のようになりargv[2]ます。

  • 引数リストの末尾を超えてアクセスするように導く、および
  • ほとんどの場合、文字データをまったく指していないランダムな値を与えます。

引数を指定せずにプログラムを開始するargvと、要素が 1 つしかなく、両方ともargv[1]存在argv[2]し、境界外アクセスになり、ランダムな値が返されます。これらのケースを防ぐには、プログラムの最初に次を配置する必要があります。

if (argc < 3) {
   cerr << "ERROR: Provide at least 2 arguments" << endl;
   return 1;
}

argv常に少なくとも 1 つの要素 (つまり、常に正しい参照) を持つことに注意してくださいargv[0]- 実行可能ファイルの名前。したがってargc、 は常に より大きいか等しい1です。

于 2012-11-21T20:04:24.600 に答える