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

3

我可以在您的代码中找到的一个错误是功能void reloop()

char *str;
cin >> str;   <---"Undefined behavior"

您不为str.

更正它:

  1. char str[SIZE];
  2. 动态分配空间:char* str = new char[SIZE];

下一个错误是:

if(strings[0] == "try")

应该:

if(strcmp( strings[0], "try")!=0)
于 2013-08-05T06:42:50.153 回答
1
   void reloop() {
     char *str; /* WRONG */
     cin >> str;
     parseargs(str);
   }

你应该这样写:

   void reloop() {
     char str[BUF_MAX]; /* ok but take care of buffer overflow; maybe use std::string */
     cin >> str;
     parseargs(str);
   }
于 2013-08-05T06:43:06.107 回答
1

即使您了解 C#,请注意您对 C++ 一无所知,即使您非常聪明,直觉也会引导您走错路(实际上,特别是如果您非常聪明:C++ 在很多部分是确实是“不合逻辑的”,所以逻辑思维根本无济于事)。

原因是 C++ 之所以如此,是因为有多种复杂的原因,包括委员会效应和许多历史遗产。无论您多么聪明,您都不会猜测历史或委员会的决定。

C ++char *的一部分是其中之一,只有了解历史(尤其是 C 的历史)才能理解。你程序中的错误是你不能写

char *str;
cin >> str;

因为你没有为它分配内存。这也是糟糕的代码,因为可能会溢出您分配的内存。如果您错过了这一点,那么您将错过很多其他更微妙的 C++ 编程要点。

帮自己一个忙,从头到尾阅读一本好的 C++ 书籍开始,而不是仅仅尝试编译器。

使用 C++ 进行实验不是一条合理的路径,因为它的结构非常复杂,有时甚至不合逻辑,并且因为“未定义的行为”意味着当你犯错时,你不能指望一个明确的错误消息,而是可能会出现疯狂的行为(包括最危险的疯狂的行为......即,即使出现错误,代码显然仍然可以工作)。

于 2013-08-05T06:55:51.873 回答
0

您的代码问题已被其他人解释。

您的代码还有一个更普遍的问题:您没有使用现有的函数或库来满足您的需求。

纯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 回答