1

まず、私のタイトルがよくある質問のように見えますが、聞いてください。「引数の解析」と言うとき、起動時にプログラムに渡されるコマンドライン引数を意味するのではありません。コマンドを受信して​​実行時に解析するための別のシステムを作成しようとしています。

主要:

int main(int argc, char *args[])
{
    cout << "Started up." << endl;
    reloop();
}
// Main execution point. Prints text to the console and moves to a void:

void reloop()
{
    char *str;
    cin >> str;
    parseargs(str);
}
// Starts waiting for inputted data, if found, move onto parseargs void.

void parseargs(char *args)
{
    char *strings[10];
    char delim[] = " ";
    int i = 0;
    strings[i] = strtok(args,delim);

    if(strings[0] == "try")
    {
        cout << "WORKED!" << endl;
        reloop();
    }
    else
    {
        cout << "Na. Didn't work." << endl;
        reloop();
    }
}
// Takes the arguments passed to it, splits them via a space and passes them to an array. From here, compares the first entry in the array to a command. If they equal, output success note.

さて、私はかなり長い間 C# プログラマーであり、C++ を始めたばかりです..何が間違っているのでしょうか? プログラムが起動すると、次のエラーが表示されます。

Debug Assertion Failed!
Program: C:\Windows\system32\MSVCP110D.dll
File: c:\program files\microsoft visual studio 11.0\vc\include\istream
Line: 990
Expression: Invalid null pointer

*注: CPP ファイルの先頭に各関数の宣言があります。

4

4 に答える 4

1

C# を知っていても、C++ については何も知らないことに注意してください。また、非常に賢い人でも、直感によって間違った道に導かれることに注意してください (実際、非常に頭が良い場合は特に: C++ のかなりの部分が確かに「非論理的」なので、論理的な心はまったく役に立ちません)。

その理由は、委員会効果や多くの歴史的遺産など、複雑な理由が混ざり合って C++ が現在のようになっているからです。どんなに賢くても、歴史や委員会の決定を推測することはできません。

C ++char *の一部は、歴史 (特に C の歴史) を知っている場合にのみ理解できることの 1 つです。あなたのプログラムのエラーは、あなたが書くことができないということです

char *str;
cin >> str;

メモリを割り当てていないためです。また、割り当てたメモリがオーバーフローする可能性があるため、悪いコードになります。これを見逃すと、C++ プログラミングの他の多くの微妙なポイントを見逃すことになります。

コンパイラを試すだけでなく、良い C++ の本を最初から最後まで読むことから始めてください。

C++ の構造は非常に複雑で、場合によっては非論理的であり、「未定義の動作」とは、間違いを犯したときに明確なエラー メッセージを期待することはできませんが、代わりにクレイジーな動作が発生する可能性があることを意味するため (最も危険なクレイジーな動作...つ​​まり、間違いがあってもコードは動作するようです)。

于 2013-08-05T06:55:51.873 に答える
0

あなたのコードの問題は他の人によって説明されています。

コードにはもう 1 つの一般的な問題があります。必要なことを実行する既存の関数またはライブラリを使用していません。

純粋な C ソリューション: http://www.gnu.org/software/libc/manual/html_node/Getopt.html

C++ Boost プログラム オプション: http://www.boost.org/doc/libs/1_54_0/doc/html/program_options.html

于 2013-08-05T13:15:46.013 に答える