用C ++解析参数

时间:2013-08-05 06:36:51

标签: c++ strtok

首先,我知道我的标题看起来像是一个常见问题,但请听我说。当我说'解析参数'时,我并不是指在启动时传递给程序的命令行参数。我正在尝试创建一个单独的系统来接收命令并在运行时解析它们。

主:

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 个答案:

答案 0 :(得分:3)

我可以在代码中找到的一个错误是函数void reloop()

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

您没有为str分配内存。

纠正它:

  1. char str[SIZE];
  2. 动态分配空间:char* str = new char[SIZE];
  3. 下一个错误是:

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

    应该是:

    if(strcmp( strings[0], "try")!=0)
    

答案 1 :(得分: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);
   }

答案 2 :(得分:1)

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

原因在于C ++是出于各种复杂原因的方式,包括委员会效应和许多历史遗产。无论你多么聪明,你都不会猜测历史和委员会的决定。

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

char *str;
cin >> str;

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

帮自己一个忙,首先阅读封面到封面a good C++ book,而不仅仅是尝试使用编译器。

使用C ++进行实验不是一个合理的路径因为它非常复杂且有时不合逻辑,并且由于“未定义的行为”意味着在做错误时你不能指望一个明确的错误消息但是可以得到疯狂的行为(包括最危险的疯狂行为......即使存在错误,代码显然仍会正常工作。)

答案 3 :(得分: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