使用argv的for循环内的C ++ std :: logic_error

时间:2019-03-07 20:43:05

标签: c++

我是C ++的新手,我正在尝试编写一个程序以接受命令行参数并生成一个.desktop文件。我正在尝试实现argv值的识别,但是我不断收到std :: logic_error

我的代码是:

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <string>

using namespace std;

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

    string name;
    string comment;

    for(int i = 1; i <= argc; i++) {
        char* tmp[] = {argv[i]};
        string param = *tmp;
        string paramVal = argv[i+1];
        if(param == "-h") {
            cout << "-h        Display this help dialogue" << endl;
            cout << "-n        Set entry name" << endl;
            cout << "-c        Set entry comment" << endl;
            cout << "-e        Set entry executable path" << endl;
            cout << "-i        Set entry icon" << endl;
            break;
        }
        else if(param == "-n") {
            name = paramVal;
            i++;
            continue;
        }
        else if(param == "-c") {
            comment = paramVal;
            i++;
            continue;
        }
        else if(param == "-e") {

        }
        else if(param == "-i") {

        }
        else {
            cout << "ERROR >>> Unrecognised parameter %s" << param << endl;
        }
    }

    cout << "Name: %s\nComment: %s" << name << comment << endl;
    return(0);
}

程序可以正常编译(使用g ++),但是当我尝试运行./createDesktopIcon -n a -c b时出现以下错误

terminate called after throwing an instance of 'std::logic_error'
  what():  basic_string::_M_construct null not valid
Aborted

请帮助,因为它非常令人沮丧

1 个答案:

答案 0 :(得分:2)

这是我看到的问题:

i <= argc

您想比较i < argc,因为数组中的argv[argc]元素实际上是argv数组中的最后一个元素。

past 。

另外,这里:

string paramVal = argv[i+1];

这也将无限制地访问数组。

您可能想看看getopt为您完成所有这些工作。